Fel*_*xyz 73 int initialization objective-c instance-variables
指望int
在Objective-C中始终初始化为0 是否安全?
更具体地说,当int
新实例化具有ivars 的对象时,可以安全地假设其ivars的值为0吗?
Ada*_*eld 112
是的,类的实例变量总是被初始化为0(或nil
,NULL
或false
,取决于确切的数据类型).请参阅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++对象)中,类实例变量也不是零初始化的.您必须在构造函数中显式初始化它们.