如何在Objective C中找到两个对象之间的细微差别

时间:2012-04-11 12:02:11

标签: objective-c ios reflection

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

或者有没有办法在控制台或文件上获取对象状态?

4 个答案:

答案 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);

获得x来源

你可以通过NSLog(@"Origin y: %f", rectObject.frame.origin.y);

获得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的调试区域。你可以检查那里的所有生物。只需按下对象旁边的箭头即可。局部变量(在破坏时存在)直接列出,成员折叠成自己。