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

时间:2009-06-13 14:58:10

标签: objective-c initialization int instance-variables

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

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

3 个答案:

答案 0 :(得分:112)

是的,类实例变量始终初始化为0(或nilNULLfalse,具体取决于确切的数据类型)。请参阅Objective-C 2.0 Programming Language

  

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


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

  

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


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

// At global scope
int a_global_var;  // guaranteed to be 0
NSString *a_global_string;  // guaranteed to be nil

除了一个例外,对于局部变量或用malloc()realloc()分配的数据,为真;对calloc()来说是正确的,因为calloc()显式地将它分配的内存清零。

一个例外是当启用自动引用计数(ARC)时,将指向Objective-C对象的堆栈指针隐式初始化为nil;但是,将它们显式初始化为nil仍然是一种很好的做法。来自Transitioning to to ARC Release Notes

  

使用nil

初始化堆栈变量      

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

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

答案 1 :(得分:-1)

我认为你不应该假设任何初始值。如果要围绕“0”值构建逻辑,则应将其设置为确定。

答案 2 :(得分:-2)

是的,在C中,全球变量被初始化为零。 在Objective-C中,甚至将局部变量初始化为零。 你可以指望它。