如何找到相同类型的两个对象之间的值差异。例如,我有一个 Rectangle 类,它具有 x、y、width、height 属性和两个矩形类对象。如何找到(以编程方式或任何可视化工具或库等)一个矩形的哪些属性与第二个矩形不同?
或者有什么方法可以在控制台或文件中获取对象状态?
如何找到相同类型的两个对象之间的值差异。例如,我有一个 Rectangle 类,它具有 x、y、width、height 属性和两个矩形类对象。如何找到(以编程方式或任何可视化工具或库等)一个矩形的哪些属性与第二个矩形不同?
或者有什么方法可以在控制台或文件中获取对象状态?
如果您在编译时确实知道对象的类,其他答案就很好。如果不是这种情况,您仍然很幸运,因为 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;
}
如果您打印对象的描述,您将了解这些值。
例如,
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);
如果 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
如果你想检查,如果两个变量指向同一个实例,你可以使用比较它们obj1 == obj2
。
如果要检查,如果您的类的两个不同实例确实具有相同的成员值,则必须单独检查每个值。(例如。obj1.property1 == obj2.property2
)。
如果您只是想检查相同的内容,则在调试时,只需放入断点并查看 xcode 的调试区域即可。你可以在那里检查所有活的物体。只需按对象旁边的箭头即可。局部变量(断点时存在)直接列出,成员折叠成self。