局部变量设置为nil?(目标C)

stu*_*ped 20 null objective-c instance-variables static-variables

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

wby*_*ung 48

启用ARC后,无论您在何处创建它们,Objective-C对象指针变量都将设置为nil.

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

分配对象时,Objective-C对象的实例变量始终设置为0(或nil).

静态设置为0.

不过,我已经习惯了总是给变量赋一个默认值.这是一个很好的习惯.

  • 对于寻找此答案来源的任何人,请参阅 Apple 的文档 Transitioning to ARC Release Notes。特别是标题为 Stack Variables Are Initialized with nil 的部分。https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html (3认同)
  • @Ricardo属性由实例变量支持,而不是局部变量.因此它属于实例变量规则,并将设置为0/FALSE/nil. (2认同)

小智 13

没有2.就像在"普通"C中一样,局部变量没有分配默认值.(虽然你第一次使用堆栈的部分时可能会很幸运:不要依赖于它!)

无论如何,nil 0 1 - 也就是说,nil == 0总是如此 - 所以NSLog("@%i", nil)说"嘿,将参数记录为整数",这是...... 0.

快乐的编码.


1请参阅gdb中的nil未定义为0x0?其中更详细地介绍了技术定义,包括Objective-C++案例.请注意,类型也会根据体系结构而变化,因此特定系统"@%i"可能会出错.

2请参阅wbyoung对ARC特定规则的回答.

  • 启用ARC后,对象就是. (2认同)