【问题标题】:Local variables set to nil? (Objective-C)局部变量设置为零? (目标-C)
【发布时间】:2012-04-18 19:18:55
【问题描述】:

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

【问题讨论】:

  • 如果这本书是你写的那样,我建议把它扔进垃圾桶,换一本别的书。 Nil 和 0 实际上是同义词。局部变量(ARC 下的对象引用除外)将是未定义的。静态变量和实例变量将是 nil/zero/NULL/Nil,它们是同义词。
  • 同意bbum;这太可怕了。这本书是什么鬼?另见:stackoverflow.com/questions/9726817/…

标签: objective-c instance-variables null static-variables


【解决方案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/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2010-12-26
  • 2022-01-07
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多