同じタイプの 2 つのオブジェクトの値の違いを見つけるにはどうすればよいですか。たとえば、x、y、幅、高さのプロパティと、四角形クラスの 2 つのオブジェクトを持つ Rectangle クラスがあります。1 つの四角形のどのプロパティが 2 番目の四角形と異なるか (プログラムまたは視覚化ツールやライブラリなど) を見つけるにはどうすればよいですか?
または、コンソールまたはファイルでオブジェクトの状態を取得する方法はありますか?
同じタイプの 2 つのオブジェクトの値の違いを見つけるにはどうすればよいですか。たとえば、x、y、幅、高さのプロパティと、四角形クラスの 2 つのオブジェクトを持つ Rectangle クラスがあります。1 つの四角形のどのプロパティが 2 番目の四角形と異なるか (プログラムまたは視覚化ツールやライブラリなど) を見つけるにはどうすればよいですか?
または、コンソールまたはファイルでオブジェクトの状態を取得する方法はありますか?
コンパイル時にオブジェクトのクラスを実際に知っている場合、他の答えは問題ありません。そうでない場合でも、Objective C では実行時にオブジェクトのインスタンス変数を調べることができるため、幸運です。2 つの未知のオブジェクトを比較する疑似コードは次のようになります。
+ (BOOL) compareObject:(id)obj1 withObject:(id)obj2 {
unsigned int varCount1, varCount2;
if ([obj1 class] != [obj2 class]) return NO;
Ivar *vars1 = class_copyIvarList([obj1 class], &varCount1);
Ivar *vars2 = class_copyIvarList([obj2 class], &varCount2);
BOOL match = YES;
for (int i = 0; i < varCount1; i++) {
Ivar var1 = vars1[i];
for (int j = 0; i < varCount2; j++) {
Ivar var2 = vars2[j];
if (strcmp(ivar_getName(var1), ivar_getName(var2)) == 0) {
if (object_getIvar(obj1, var1) != object_getIvar(obj2, var2)) {
match = NO;
break;
}
}
}
if (!match) break;
}
free(vars1);
free(vars2);
return match;
}
オブジェクトの説明を印刷すると、値について知ることができます。
たとえば、
CGRect rect = CGRectMake(10,10,20,20);
Rectangle *rectObject = [[Rectangle alloc] initWithFrame:rect];
NSLog(@"Desc : %@",[rectObject description]);
また、比較したい場合は、
あなたは x の起源を得ることができます NSLog(@"Origin x: %f", rectObject.frame.origin.x);
あなたはy原点を得ることができます NSLog(@"Origin y: %f", rectObject.frame.origin.y);
同様に、次の方法で幅を取得できます。
NSLog(@"Width : %f", rectObject.frame.size.width);
NSLog(@"Height : %f", rectObject.frame.size.height);
x、y などが float の場合、Rect1 と Rect2 が 2 つのオブジェクトであると仮定します。
NSLog(@"for Rect1 \nx %f y %f \nFor Rect2 \nx %f y%f",Rect1.x,Rect1.y,Rect2.x,Rext2.y);
これは Rect1 と Rect2 の x と y をそれぞれ表示します
確認したい場合は、2 つの変数が同じインスタンスを指しているかどうかを、 を使用して比較できますobj1 == obj2
。
クラスの 2 つの異なるインスタンスが同じメンバー値を持っているかどうかを確認したい場合は、それぞれの値を個別に確認する必要があります。(例: obj1.property1 == obj2.property2
)。
デバッグ中に同じことを確認したいだけの場合は、ブレークポイントを入れて、xcode のデバッグ領域を見てください。そこにあるすべての生き物を調べることができます。オブジェクトのすぐ横にある矢印を押すだけです。ローカル変数 (ブレークポイントの時点で存在する) は直接リストされ、メンバーは自己に折りたたまれます。