我知道初始NSNumber的正确方法是NSNumber *a = @1;
当我宣布NSNumber *a = 1;
时,我会收到错误
使用arc
禁止将int隐式转换为nsnumber
但我不知道为什么当我声明NSNumber *a = 0;
时没有错误
就我而言,我在NSNumber类别中编写了一些函数 然后
@0
,我通常可以使用类别中的函数0
,我可以使用类别中的函数,没有发生错误但是当运行app时,此函数将永远不会调用答案 0 :(得分:11)
值0与nil
或NULL
同义,它们是指针的有效值。
这与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。 返回的结构将所有成员初始化为零。
中