int
在 Objective-C 中,总是将 s 初始化为 0是否安全?
更具体地说,当一个具有int
ivars 的对象被新实例化时,假设其 ivars 的值为 0 是否安全?
int
在 Objective-C 中,总是将 s 初始化为 0是否安全?
更具体地说,当一个具有int
ivars 的对象被新实例化时,假设其 ivars 的值为 0 是否安全?
是的,类实例变量始终初始化为 0(或nil
、NULL
、 或false
,具体取决于确切的数据类型)。请参阅Objective-C 2.0 编程语言:
该
alloc
方法为新对象的实例变量动态分配内存,并将它们全部初始化为 0 — 全部,即除了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
除了一个例外,它不适用于局部变量,或者用malloc()
or分配的数据realloc()
;对 来说是正确的calloc()
,因为calloc()
显式地将它分配的内存清零。
一个例外是,当启用自动引用计数 (ARC) 时,指向 Objective-C 对象的堆栈指针被隐式初始化为nil
; 但是,将它们显式初始化为nil
. 从过渡到 ARC 发行说明:
堆栈变量初始化为
nil
使用 ARC,强、弱和自动释放堆栈变量现在隐式初始化为
nil
在 C++(以及 Objective-C++ 中使用的 C++ 对象)中,类实例变量也不是零初始化的。您必须在构造函数中显式初始化它们。
我认为您不应该为初始化假设任何值。如果您正在围绕“0”值构建逻辑,则应将其设置为确定。
是的,在 C 中,全局变量被初始化为零。在 Objective-C 中,甚至局部变量也被初始化为零。你可以指望它。