Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSNumber:否==0?_Objective C - Fatal编程技术网

Objective c NSNumber:否==0?

Objective c NSNumber:否==0?,objective-c,Objective C,第一个断言通过,第二个断言失败,为什么?因为他们的“对象类型”不同?isEqual:和==运算符的定义有什么区别 我这么做的原因:我必须在一些后端存储一个布尔值,这些后端的API需要一个NSNumber而不是BOOL,所以我必须在存储它们之前将所有BOOL转换为NSNumber。我需要转换,反之亦然 操作员 =运算符比较本机键入的值以及对象指针,以查看它们是否完全相同。如果您想查看两个本机类型的值是否相等(1==1,其中1是一个int)。它还可以让您查看两个指针是否指向同一个对象。例如,如果您有

第一个断言通过,第二个断言失败,为什么?因为他们的“对象类型”不同?isEqual:和==运算符的定义有什么区别


我这么做的原因:我必须在一些后端存储一个布尔值,这些后端的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]也是真的。