为什么NSNumber * a = 0不显示错误

时间:2016-08-23 10:46:55

标签: ios objective-c

我知道初始NSNumber的正确方法是NSNumber *a = @1;

当我宣布NSNumber *a = 1;时,我会收到错误

  

使用arc

禁止将int隐式转换为nsnumber

但我不知道为什么当我声明NSNumber *a = 0;时没有错误

就我而言,我在NSNumber类别中编写了一些函数 然后

  • 如果NSNumber的值为@0,我通常可以使用类别中的函数
  • 如果NSNumber的值是0,我可以使用类别中的函数,没有发生错误但是当运行app时,此函数将永远不会调用

5 个答案:

答案 0 :(得分:11)

值0与nilNULL同义,它们是指针的有效值。

这与C的兼容性导致了这种不一致的行为。

<强>记录

在C语言中,没有特殊的符号来表示未初始化的指针。相反,选择值0(零)来表示这样的指针。为了使代码更易理解,引入了预处理器宏来表示此值:NULL。因为它是一个宏,所以C编译器本身永远不会看到符号;它只看到0(零)。

这意味着0(零)是指定给指针时的特殊值。即使它是一个整数,编译器也会接受赋值,而不会抱怨类型转换,隐式或其他。

为了保持与C的兼容性,Objective-C允许为任何指针分配文字0。编译器将其视为与分配nil相同。

答案 1 :(得分:3)

0是空指针常量。可以将空指针常量分配给任何指针变量,并将其设置为NULL或nil。至少在过去的45年里,C就是这种情况,Objective-C也是如此。与NSNumber * a = nil相同。

答案 2 :(得分:1)

您可以将0视为可以分配给nil的{​​{1}}或null,但object是整数且不允许对象或非整数。

答案 3 :(得分:0)

Objective-C默默地忽略对值为0的对象指针的方法调用(即nil)。这就是为什么当您调用NSNumber类别指针的方法时,没有任何反应,您指定了值0

答案 4 :(得分:0)

如果没有其他值可供使用,nil值是初始化对象指针最安全的方法,因为在Objective-C中向nil发送消息是完全可以接受的。如果您确实向nil发送消息,那么显然没有任何反应。

注意:如果您希望发送的消息的返回值为nil,则对象返回类型的返回值为nil;对于数字类型,返回值为 0,对于BOOL类型,返回值为NO。 返回的结构将所有成员初始化为零。

在上一篇Apple Doc Working with nil