整体是否始终初始化为0?

Fel*_*xyz 73 int initialization objective-c instance-variables

指望int在Objective-C中始终初始化为0 是否安全?

更具体地说,当int新实例化具有ivars 的对象时,可以安全地假设其ivars的值为0吗?

Ada*_*eld 112

是的,类的实例变量总是被初始化为0(或nil,NULLfalse,取决于确切的数据类型).请参阅Objective-C 2.0编程语言:

alloc方法为新对象的实例变量动态分配内存,并将它们全部初始化为0-all,即除了isa将新实例连接到其类的变量之外.


编辑2013-05-08
Apple似乎已经删除了上述文件(现在链接到The Wayback Machine).(目前)活动文档Programming With Objective-C包含类似的引文:

alloc方法还有另一项重要任务,即通过将对象属性设置为零来清除为对象属性分配的内存.这避免了以前存储的包含垃圾的内存的常见问题,但不足以完全初始化对象.


但是,这适用于类的变量; 对于在全局范围内声明的POD类型也是如此:

// At global scope
int a_global_var;  // guaranteed to be 0
NSString *a_global_string;  // guaranteed to be nil
Run Code Online (Sandbox Code Playgroud)

除了一个例外,对于局部变量或者用或分配的数据不是这样; 这是真的,因为它明确地将它分配的内存清零.malloc()realloc()calloc()calloc()

一个例外是当启用自动引用计数(ARC)时,将指向Objective-C对象的堆栈指针隐式初始化为nil; 但是,明确初始化它们仍然是一种很好的做法nil.从过渡到ARC发行说明:

堆栈变量初始化为 nil

使用ARC,现在可以隐式初始化强,弱和自动释放堆栈变量 nil

在C++(以及Objective-C++中使用的C++对象)中,类实例变量也不是零初始化的.您必须在构造函数中显式初始化它们.

  • @PsychoDad我的经历恰恰相反. (4认同)
  • 发现.然而,人们经常对这个细节感到疑惑的事实可能足以让他们更明确地初始化变量,可以说是"更安全"的选择.初始化为0/nil/NULL从不伤害任何人...... :-) (3认同)