是否总是将int初始化为0?


Answers:


114

是的,类的实例变量总是被初始化为0(或nilNULLfalse,取决于确切的数据类型)。请参阅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 ++对象)中,类实例变量也不是零初始化的。您必须在构造函数中显式初始化它们。


3
发现。但是,人们经常对这个细节感到疑惑的事实足以成为更明确地初始化变量(可以说是“更安全”的选择)的理由。初始化为0 / nil / NULL绝对不会伤害任何人... :-)
Quinn Taylor

4
@PsychoDad我的经历正好相反。

1
@庞:现在固定。苹果遗憾地删除了原始的“ Objective-C 2.0编程语言”文档AFAICT。
亚当·罗森菲尔德

1
在ARC下,类型的局部变量id也被初始化为nil。
LearnCocos2D 2013年

1
@ n00bProgrammer:是的。在上述情况下,所有变量对于其各自的数据类型均以“零初始化”的方式表示。算术类型(intNSUIntegerCGFloatfloatboolBOOLchar,等等)都被初始化到在这些类型的代表0。
亚当·罗森菲尔德2014年

-1

我认为您不应该为初始化假设任何值。如果要围绕“ 0”值构建逻辑,则应进行设置以确保确定。


我认为我们可以将其视为C ++的有效答案,而亚当的答案适用于Objective-C?
Felixyz

11
亚当对目标C的回答是完全正确的-目标C绝对保证将ivars在分配时设置为nil / NULL / false / 0,并且完全可以接受和使用这个事实。例如,当发现它们为nil时,可以使用[NSMultableArray array或new]对NSMultableArray * ivars进行简单的延迟初始化。结合使用目标C保证[(NSMultableArray *)count]返回0,通常可以进一步推迟初始化。学会热爱目标C的实现方式,而不仅仅是与之抗衡。
Peter N Lewis

-2

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


1
@AdamRosenfield的答案与您的主张(甚至将本地变量初始化为零)直接矛盾。谁错了?
Mark Amery 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.