如何找到两个相同类型的对象之间的值差异。例如,我有一个Rectangle类,它有x,y,width,height属性和两个矩形类对象。如何找到(以编程方式或任何可视化工具或库等)一个矩形的哪些属性与第二个矩形不同?
或者有没有办法在控制台或文件上获取对象状态?
答案 0 :(得分:3)
如果您在编译时 知道对象的类,那么其他答案就可以了。如果不是这种情况,您仍然很幸运,因为Objective C允许您在运行时探索对象的实例变量。比较两个未知对象的伪代码可以是:
+ (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;
}
答案 1 :(得分:0)
如果您打印对象的描述,您将了解这些值。
例如,
CGRect rect = CGRectMake(10,10,20,20);
Rectangle *rectObject = [[Rectangle alloc] initWithFrame:rect];
NSLog(@"Desc : %@",[rectObject description]);
另外,如果你想比较,
你可以通过NSLog(@"Origin x: %f", rectObject.frame.origin.x);
你可以通过NSLog(@"Origin y: %f", rectObject.frame.origin.y);
同样,您可以通过
获得宽度NSLog(@"Width : %f", rectObject.frame.size.width);
NSLog(@"Height : %f", rectObject.frame.size.height);
答案 2 :(得分:0)
如果x,y等是浮点数,那么假设Rect1和Rect2是两个对象,那么
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
答案 3 :(得分:0)
如果要检查,如果两个变量指向同一个实例,则可以使用obj1 == obj2
对它们进行比较。
如果要检查,如果您的类的两个不同实例具有相同的成员值,则必须自行检查每个值。 (例如obj1.property1 == obj2.property2
)。
如果您只是想检查一下,在调试时,只需输入一个断点并查看xcode的调试区域。你可以检查那里的所有生物。只需按下对象旁边的箭头即可。局部变量(在破坏时存在)直接列出,成员折叠成自己。