为什么= 32在32位与64位iOS设备上表现不同?

时间:2016-12-07 16:20:49

标签: ios objective-c

我知道Objective-C ==isEqual:非常不同。但我很好奇为什么以下代码在32位与64位iOS设备上产生一致的不同结果。

NSIndexPath* a = [NSIndexPath indexPathForItem:0 inSection:0];
NSIndexPath* b = [NSIndexPath indexPathForItem:0 inSection:0];
NSLog(@"%@", a == b ? @"YES" : @"NO");
NSLog(@"%@", [a isEqual:b] ? @"YES" : @"NO");

在32位设备上,例如iPhone 5,==总是失败(预期)。

2016-12-07 09:55:18.019 NSIndexPathTestObjc[18667:1958831] NO
2016-12-07 09:55:18.020 NSIndexPathTestObjc[18667:1958831] YES

在64位设备上,例如iPhone 6s,==成功(意外)。

2016-12-07 09:56:05.503 NSIndexPathTestObjc[18780:1960472] YES
2016-12-07 09:56:05.505 NSIndexPathTestObjc[18780:1960472] YES

1 个答案:

答案 0 :(得分:4)

  

我知道Objective-C ==与isEqual非常不同:

是的 - 您应该使用后者来比较两个对象。 ==仅告诉您比较的指针是否相同。

  

但我很好奇为什么以下代码在32位与64位iOS设备上产生一致的不同结果。

这可能只是-indexPathForItem:inSection:的实现细节,它可能会缓存它在64位系统上生成的索引路径,并在第二次使用相同项调用方法时返回缓存对象,但是不适用于32位系统。不要依赖此行为:使用-isEqual:进行对象比较。