Objective c NSNumber:否==0?
第一个断言通过,第二个断言失败,为什么?因为他们的“对象类型”不同?isEqual:和==运算符的定义有什么区别Objective c NSNumber:否==0?,objective-c,Objective C,第一个断言通过,第二个断言失败,为什么?因为他们的“对象类型”不同?isEqual:和==运算符的定义有什么区别 我这么做的原因:我必须在一些后端存储一个布尔值,这些后端的API需要一个NSNumber而不是BOOL,所以我必须在存储它们之前将所有BOOL转换为NSNumber。我需要转换,反之亦然 操作员 =运算符比较本机键入的值以及对象指针,以查看它们是否完全相同。如果您想查看两个本机类型的值是否相等(1==1,其中1是一个int)。它还可以让您查看两个指针是否指向同一个对象。例如,如果您有
我这么做的原因:我必须在一些后端存储一个布尔值,这些后端的API需要一个NSNumber而不是BOOL,所以我必须在存储它们之前将所有BOOL转换为NSNumber。我需要转换,反之亦然 操作员
=
运算符比较本机键入的值以及对象指针,以查看它们是否完全相同。如果您想查看两个本机类型的值是否相等(1==1
,其中1是一个int
)。它还可以让您查看两个指针是否指向同一个对象。例如,如果您有:
NSNumber *x = [NSNumber numberWithBool:NO];
NSNumber *y = [NSNumber numberWithUnsignedInt:0];
assert([x isEqual:y]);
assert(x==y);
然后x==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。操作符=
的原因
=
运算符比较本机键入的值以及对象指针,以查看它们是否完全相同。如果您想查看两个本机类型的值是否相等(1==1
,其中1是一个int
)。它还可以让您查看两个指针是否指向同一个对象。例如,如果您有:
NSNumber *x = [NSNumber numberWithBool:NO];
NSNumber *y = [NSNumber numberWithUnsignedInt:0];
assert([x isEqual:y]);
assert(x==y);
然后x==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的原因。如果x
和y
都是[NSNumber numberWithBool:NO]
,这可能会更明显,如果x
和y
都是[NSNumber numberWithBool:NO]
的话,这可能会在=
时失败,这可能会更明显,但在=
时仍然会失败。我觉得有趣的是,[x isEqual:y]是真的,即使[x objCType]是“c”,而[y objCType]是“i”。我觉得有趣的是即使[x objCType]是'c'并且[y objCType]是'i',[x isEqual:y]也是真的。