1
NSNumber *x = [NSNumber numberWithBool:NO];
NSNumber *y = [NSNumber numberWithUnsignedInt:0];
assert([x isEqual:y]);
assert(x==y);

第一个断言通过,第二个断言失败,为什么?因为他们的'objCType'不同?isEqual: 和 == operator 的定义有什么区别?

为什么我这样做:我必须在某个后端存储一个布尔值,其 API 需要一个 NSNumber 而不是 BOOL,所以我必须在存储它们之前将所有 BOOL 转换为 NSNumber。我也需要反之亦然。

4

1 回答 1

5

运营==

==运算符比较本机类型的值以及对象指针以查看它们是否完全相同。如果您想查看两个本机类型的值是否相等(1 == 1,其中 1 是int),这将很有用。它还可以让您查看两个指针是否指向同一个对象。例如,如果你有这个:

NSNumber *x = [NSNumber numberWithBool:NO];
NSNumber *y = x;

thenx==y为真,因为x指向与 相同的对象y

isEqual:方法_

isEqual:方法只是比较两者NSObjects,看它们是否是相同的,但不一定是完全相同的对象[x isEqual:y]问,“与?x相同y?”,而x==y问,“与?x指向同一个对象y?”

(请记住,当您使用 时*,您是在声明一个指针。)

结论

由于您没有使用本机类型的值或指针,因此您应该使用isEqual:. 该isEqual:方法比较两个对象的值,而不是对象本身。

此外,[NSNumber numberWithBool:NO]并且[NSNumber numberWithUnsignedInt:0]确实产生了相同的值,这就是isEqual:返回 true 的原因。

于 2012-11-01T12:53:17.477 回答