在Objective-C中,int
始终被初始化为0是否安全?
更具体地说,当一个具有int
ivars的对象被新实例化时,可以安全地假设它的ivars值为0吗?
答案 0 :(得分:112)
是的,类实例变量始终初始化为0(或nil
,NULL
或false
,具体取决于确切的数据类型)。请参阅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中,甚至将局部变量初始化为零。 你可以指望它。