1

如何找到相同类型的两个对象之间的值差异。例如,我有一个 Rectangle 类,它具有 x、y、width、height 属性和两个矩形类对象。如何找到(以编程方式或任何可视化工具或库等)一个矩形的哪些属性与第二个矩形不同?

或者有什么方法可以在控制台或文件中获取对象状态?

4

4 回答 4

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;
}
于 2012-04-11T12:27:41.077 回答
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);
于 2012-04-11T12:06:27.820 回答
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

于 2012-04-11T12:06:35.377 回答
0

如果你想检查,如果两个变量指向同一个实例,你可以使用比较它们obj1 == obj2

如果要检查,如果您的类的两个不同实例确实具有相同的成员值,则必须单独检查每个值。(例如。obj1.property1 == obj2.property2)。

如果您只是想检查相同的内容,则在调试时,只需放入断点并查看 xcode 的调试区域即可。你可以在那里检查所有活的物体。只需按对象旁边的箭头即可。局部变量(断点时存在)直接列出,成员折叠成self。

于 2012-04-11T12:13:59.600 回答