int
在Objective-C中始终将s初始化为0的数字是否安全?
更具体地说,当int
新实例化具有ivars的对象时,可以安全地假定其ivars的值为0吗?
Answers:
是的,类的实例变量总是被初始化为0(或nil
,NULL
或false
,取决于确切的数据类型)。请参阅Objective-C 2.0编程语言:
该
alloc
方法为新对象的实例变量动态分配内存,并将它们全部初始化为0,即将isa
新实例连接到其类的变量除外。
编辑2013-05-08
苹果似乎已经删除了上述文档(现已链接至“回溯机器”)。(当前)有效文档“使用Objective-C编程”包含类似的引用:
该
alloc
方法还有一项重要任务,就是通过将它们设置为零来清除为对象属性分配的内存。这样可以避免通常的问题,即内存中的垃圾以前没有存储过,但是不足以完全初始化对象。
但是,这仅适用于类的实例变量。对于在全局范围内声明的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
。从过渡到ARC发行说明:
堆栈变量使用初始化
nil
使用ARC,现在可以使用以下隐式初始化强,弱和自动释放堆栈变量:
nil
在C ++(以及Objective-C ++中使用的C ++对象)中,类实例变量也不是零初始化的。您必须在构造函数中显式初始化它们。
id
也被初始化为nil。
int
,NSUInteger
,CGFloat
,float
,bool
,BOOL
,char
,等等)都被初始化到在这些类型的代表0。
我认为您不应该为初始化假设任何值。如果要围绕“ 0”值构建逻辑,则应进行设置以确保确定。
是的,在C语言中,全局变量被初始化为零。在Objective-C中,甚至本地变量也被初始化为零。你可以指望它。