我正在阅读一本有关Objective-C的书籍,作者说如果局部变量没有被赋值,它们将被设置为nil,但静态变量将被设置为零。因此,我声明了一个int a
的变量,并没有给它赋值。然后用NSLog(@"%i", a)
来显示它,结果a
被显示为零。对此我感到有些困惑,希望有人能为我澄清一下。
我正在阅读一本有关Objective-C的书籍,作者说如果局部变量没有被赋值,它们将被设置为nil,但静态变量将被设置为零。因此,我声明了一个int a
的变量,并没有给它赋值。然后用NSLog(@"%i", a)
来显示它,结果a
被显示为零。对此我感到有些困惑,希望有人能为我澄清一下。
启用ARC后,无论在哪里创建Objective-C对象指针变量时,它们都将被设置为nil。
如果没有启用ARC,对于内置的C类型,您的变量将不会被初始化。
当您分配对象时,Objective-C对象的实例变量总是设置为0(或nil)。
静态变量将被设置为0。
我已经养成了始终给变量赋一个默认值的习惯。这是一个很好的习惯。
No2. 就像 "普通" C 一样,局部变量没有分配默认值。(虽然第一次使用时可能会得到幸运部分的栈:但不要依赖这个!)
无论如何,nil
等于 01 - 也就是说,nil == 0
总是成立的 - 所以 NSLog("@%i", nil)
表示“嘿,将参数作为整数记录在日志中”,即... 0。
快乐编码。
1请参阅gdb 中的 nil 未定义为 0x0?,该链接详细介绍了技术定义,包括 Objective-C++ 的情况。请注意,类型也会根据体系结构而更改,因此对于特定系统,“@%i”可能是 错误的。
2 有关ARC特定规则,请参见wbyoung的回答。
static
变量被初始化为0。 - jscs