局部变量设置为零? (目标-C)
Posted
技术标签:
【中文标题】局部变量设置为零? (目标-C)【英文标题】:Local variables set to nil? (Objective-C) 【发布时间】:2012-04-18 19:18:55 【问题描述】:我正在阅读一本关于 Objective-C 的书,作者说如果没有为局部变量赋值,它们将被设置为 nil,但静态变量将被设置为零。所以,我设置了int a
并没有给它赋值。然后NSLog(@"%i", a)
显示它,a
显示为零。我对此有点困惑,我想知道是否有人可以为我澄清一下?
【问题讨论】:
如果这本书是你写的那样,我建议把它扔进垃圾桶,换一本别的书。 Nil 和 0 实际上是同义词。局部变量(ARC 下的对象引用除外)将是未定义的。静态变量和实例变量将是 nil/zero/NULL/Nil,它们是同义词。 同意bbum;这太可怕了。这本书是什么鬼?另见:***.com/questions/9726817/… 【参考方案1】:没有2。就像在“普通”C 中一样,局部变量没有被赋予默认值。 (虽然第一次使用堆栈的一部分时您可能会很幸运:不要依赖这个!。)
无论如何,nil
is 01 - 也就是说,nil == 0
始终为真 - 所以NSLog("@%i", nil)
说“嘿,将参数记录为一个整数”,即... 0。
编码愉快。
1 请参阅nil in gdb is not defined as 0x0?,其中更详细地介绍了技术定义,包括 Objective-C++ 案例。请注意,类型也会根据架构发生变化,因此 "@%i"
对于特定系统很可能错误。
2请参阅 wbyoung 对 ARC-specific 规则的回答。
【讨论】:
静态变量也一样吗?因为,作者说给静态变量赋值为零是多余的,因为它们的默认值是零。 启用 ARC 后,对象是。 @stumped:是的,static
变量被初始化为 0。【参考方案2】:
启用 ARC 后,无论您在何处创建 Objective-C 对象指针变量,它们都将设置为 nil。
如果没有 ARC,对于内置的 C 类型,您的变量将不会被初始化。
在分配对象时,Objective-C 对象的实例变量总是设置为 0(或 nil)。
静态设置为 0。
不过,我已经养成了总是给变量一个默认值的习惯。这是一个好习惯。
【讨论】:
带有 ARC 的 C 类型呢?如果我在使用 ARC 时有一个 BOOL 怎么办?谢谢! @Ricardo 他们应该根据 C 规则来处理。静态将是 0,所有其他都应该被视为垃圾。 谢谢。所以,像@property (nonatomic, assign) BOOL flag;是gargabe,不是吗?因为不是 staitc。但是在我的应用程序中,我看到它始终为 0。我对这些规则不是很清楚。 @Ricardo 该属性由实例变量支持,而不是局部变量。所以它属于实例变量规则,会被设置为0/FALSE/nil。 对于寻找此答案来源的任何人,请参阅 Apple 的文档 Transitioning to ARC Release Notes。特别是标题为堆栈变量的部分是用 nil 初始化的。 developer.apple.com/library/content/releasenotes/ObjectiveC/…以上是关于局部变量设置为零? (目标-C)的主要内容,如果未能解决你的问题,请参考以下文章