21

我正在阅读一本关于 Objective-C 的书,作者说如果没有为局部变量赋值,它们将被设置为 nil,但静态变量将被设置为零。所以,我设置int a并没有给它赋值。然后NSLog(@"%i", a)显示它并a显示为零。我对此有点困惑,我想知道是否有人可以为我澄清一下?

4

2 回答 2

52

启用 ARC 后,无论您在何处创建它们,您的 Objective-C 对象指针变量都将设置为 nil。

如果没有 ARC,对于内置的 C 类型,您的变量将不会被初始化。

当你分配一个对象时,Objective-C 对象的实例变量总是设置为 0(或 nil)。

静力学设置为 0。

不过,我已经养成了总是给变量一个默认值的习惯。这是一个好习惯。

于 2012-04-05T03:26:43.163 回答
13

没有2。就像在“普通”C 中一样,局部变量没有分配默认值。(虽然你可能会在第一次使用堆栈的一部分时很幸运:不要依赖这个!。)

无论如何,nil 0 1 - 也就是说,nil == 0始终为真 - 所以NSLog("@%i", nil)说“嘿,将参数记录为整数”,即 ... 0。

快乐编码。


1看到gdb中的nil没有定义为0x0?其中更详细地涵盖了技术定义,包括 Objective-C++ 案例。请注意,类型也会根据架构发生变化,因此对于特定系统"@%i"很可能是错误的。

2请参阅 wbyoung 对ARC 特定规则的回答。

于 2012-04-05T02:56:17.943 回答