本地变量设置为nil?(Objective-C)

22

我正在阅读一本有关Objective-C的书籍,作者说如果局部变量没有被赋值,它们将被设置为nil,但静态变量将被设置为零。因此,我声明了一个int a 的变量,并没有给它赋值。然后用NSLog(@"%i", a)来显示它,结果a被显示为零。对此我感到有些困惑,希望有人能为我澄清一下。


12
如果这本书说的就像你写的那样,我建议把它扔进垃圾桶,找一本不同的书。"Nil"和"0"在实质上是同义词。局部变量(除了ARC下的对象引用)将未定义。静态和实例变量将是nil/zero/NULL/Nil,它们是同义词。 - bbum
1
同意bbum的观点,这太糟糕了。这是什么书?另请参阅:http://stackoverflow.com/questions/9726817/can-variables-be-set-randomly-when-declaring-them-again/9726948#9726948 - jscs
2个回答

53

启用ARC后,无论在哪里创建Objective-C对象指针变量时,它们都将被设置为nil。

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

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

静态变量将被设置为0。

我已经养成了始终给变量赋一个默认值的习惯。这是一个很好的习惯。


C类型在ARC下怎么办?如果我在使用ARC时有一个BOOL类型怎么办?谢谢! - Ricardo
1
@Ricardo,它们应该按照C规则进行处理。静态变量将为0,而所有其他变量应被视为垃圾。 - wbyoung
谢谢。那么,类似@property (nonatomic, assign) BOOL flag;这样的东西就是垃圾,因为它不是静态的,对吗?但是在我的应用程序中,我发现它总是0。我对这些规则并不是很清楚。 - Ricardo
2
@Ricardo 这个属性是由一个实例变量支持的,而不是本地变量。因此,它遵循实例变量规则,并将被设置为0/FALSE/nil。 - wbyoung
3
若有人想查看这个答案的来源,请参阅苹果公司的《转换到ARC发布说明》文档。具体来说,查看“堆栈变量用nil初始化”的部分。https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html - Pouria Almassi

13

No2. 就像 "普通" C 一样,局部变量没有分配默认值。(虽然第一次使用时可能会得到幸运部分的栈:但不要依赖这个!)

无论如何,nil 等于 01 - 也就是说,nil == 0 总是成立的 - 所以 NSLog("@%i", nil) 表示“嘿,将参数作为整数记录在日志中”,即... 0。

快乐编码。


1请参阅gdb 中的 nil 未定义为 0x0?,该链接详细介绍了技术定义,包括 Objective-C++ 的情况。请注意,类型也会根据体系结构而更改,因此对于特定系统,“@%i”可能是 错误的

2 有关ARC特定规则,请参见wbyoung的回答。


静态变量也是一样吗?因为作者说将零分配给静态变量是多余的,因为它们的默认值为零。 - stumped
2
启用ARC后,对象将会被自动管理。 - wbyoung
1
@stumped:是的,static变量被初始化为0。 - jscs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接