我正在读一本关于Objective-C的书,作者说如果没有为局部变量赋值,它们将被设置为nil,但静态变量将被设置为零。所以,我设置int a
并没有给它赋值。然后NSLog(@"%i", a)
显示它,a
显示为零。我对此感到有些困惑,我想知道是否有人可以为我澄清一下?
答案 0 :(得分:47)
启用ARC后,无论您在何处创建它们,Objective-C对象指针变量都将设置为nil。
如果没有ARC,对于内置C类型,您的变量将不会被初始化。
分配对象时,Objective-C对象的实例变量始终设置为0(或nil)。
静态设置为0。
我已经养成了总是给变量赋予默认值的习惯。这是一个很好的习惯。
答案 1 :(得分:12)
没有 2 。就像在“普通”C中一样,局部变量不分配了默认值。 (虽然你第一次使用部分堆栈时可能会很幸运:不依赖于它!)
无论如何,nil
0 1 - 也就是说,nil == 0
始终为真 - 所以NSLog("@%i", nil)
说“嘿,将参数记录为整数“,这是...... 0。
快乐的编码。
1 更详细地参见nil in gdb is not defined as 0x0?,其中包括技术定义,包括Objective-C ++案例。请注意,类型也会根据体系结构而变化,因此对于特定系统,"@%i"
很可能错误。
2 请参阅wbyoung对 ARC特定规则的回答。