2009-06-13 57 views

回答

110

是的,类实例变量始终初始化为0(或者nil,NULLfalse,具体取决于确切的数据类型)。见Objective-C 2.0 Programming Language

alloc方法动态分配内存为新对象的实例变量,并将其全部初始化为0,所有的,也就是说,除了新的实例连接到其类isa变量。


编辑2013年5月8日
苹果似乎已经删除了上述文件(现在连接到自由之路机)。 (目前)活动文档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()realloc()分配的数据;它是calloc()真实的,因为calloc()明确零出它分配的内存。

一个例外是,当自动引用计数(ARC)被使能,堆栈指针Objective-C的对象被隐式地初始化为nil;但是,将它们明确初始化为nil仍然是一个好习惯。从Transitioning to to ARC Release Notes

堆栈变量与nil

使用ARC,强,弱,并自动释放堆栈变量初始化正在暗中与nil

在C初始化++(和C++对象是在Objective-C++)中使用,类的实例变量也零初始化。你必须在你的构造函数中明确地初始化它们。

+3

现货。然而,人们经常对这个细节感到疑惑的事实足以使变量初始化更明确,可以说是“更安全”的选择。初始化为0/nil/NULL从不伤害任何人...... :-) – 2009-06-13 16:36:30

-1

我不认为你应该承担任何初始值。如果围绕“0”值构建逻辑,则应将其设置为确定。

+0

我认为我们可以看到这是C++的有效答案,而Adam的答案适用于Objective-C? – Felixyz 2009-06-13 15:41:42

+11

Adam对Objective C的回答是完全正确的 - Objective C绝对保证ivars在分配时被设置为nil/NULL/false/0,接受和使用这个事实是非常明智的。例如,这可以使NSMultableArray * ivars在[NSMultableArray数组或新]之间进行简单的延迟初始化,当它们被注意到为零时。结合Objective C guarentteing [(NSMultableArray *)count]返回0,通常可以进一步推迟初始化。学会热爱Objective C这样做的方式,而不是仅仅与它的差异作斗争。 – 2009-06-15 01:52:11

-2

是的,在C全局变量初始化为零。在Objective-C中,即使局部变量也被初始化为零。 你可以依靠它。