74

int在 Objective-C 中,总是将 s 初始化为 0是否安全?

更具体地说,当一个具有intivars 的对象被新实例化时,假设其 ivars 的值为 0 是否安全?

4

3 回答 3

117

是的,类实例变量始终初始化为 0(或nilNULL、 或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++ 对象)中,类实例变量也不是零初始化的。您必须在构造函数中显式初始化它们。

于 2009-06-13T15:03:21.770 回答
-1

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

于 2009-06-13T15:01:11.463 回答
-3

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

于 2013-05-23T15:58:21.730 回答