NSNumber:NO == 0?

时间:2012-11-01 12:49:10

标签: objective-c

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。我也需要转换反之亦然。

1 个答案:

答案 0 :(得分:5)

==运算符

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

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

然后x==y为真,因为x指向与y相同的对象。

isEqual:方法

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

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

<强>结论

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

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