2016-08-23 61 views
1

我知道最初一个NSNumber的正确的方法是NSNumber *a = @1;为什么的NSNumber * a = 0时不显示错误

,当我宣布NSNumber *a = 1;,我就得到了错误的int到

隐式转换的NSNumber是不允许用圆弧

但我不知道为什么,当我宣布NSNumber *a = 0;没有错误

就我而言,我有写的NSNumber类 一些功能,然后

  • 如果NSNumber的价值是@0,我可以使用的功能类别通常
  • 如果NSNumber的价值是0,我可以使用功能类别,没有错误发生,但运行应用程序时,该功能将永远不会调用
+3

的问题是,对象 - 是只对C的层,因此它仍然包含所有从C的特征例如在于'0'和'NULL'和falsy布尔都是一样。以同样的方式,你可以写'if(20){'。 苹果公司决定转向现代编程语言(Swift)的许多原因之一,这一原因并未受到40年前语言设计决策的困扰。 – Sulthan

回答

11

0值是nilNULL,这是一个指针有效值的代名词。

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

历史

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

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

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

+0

那么'0'的特殊情况对'1'不存在?我要问的原因是'nil'被定义为'(id)0'和'NULL'作为'(void *)0'(我上次看到的),所以这与'0'不一样。所以有些奇怪的事情正在发生。 – Droppy

+0

是的。 0是一种特殊情况,因为在C中,符号'NULL'是值为0的预处理器定义。这意味着,对于编译器来说,分配'NULL'实际上分配为0.为了与C保持兼容性,Objective-C即使在ARC下,也允许将一个文字零(但不包括运行时值为零的变量)分配给任何指针。 – Avi

+0

Upvote for your nice answer – user3182143

3

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

1

你可以考虑0nilnull可以分配给object1是整数,不能让反对或非整数。

0

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

0

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

注意:如果你希望从发送到零消息的返回值,返回值将是零的对象返回类型,0数字类型,并没有找到BOOL类型。返回的结构将所有成员初始化为零。

在过去Apple Doc Working with nil

相关问题