整数总是初始化为0吗?
Posted
技术标签:
【中文标题】整数总是初始化为0吗?【英文标题】:Are ints always initialized to 0? 【发布时间】:2010-11-02 17:06:15 【问题描述】:指望int
s 在 Objective-C 中总是被初始化为 0 是否安全?
更具体地说,当一个具有int
ivars 的对象被新实例化时,假设其 ivars 的值为 0 是否安全?
【问题讨论】:
【参考方案1】:是的,类实例变量始终初始化为 0(或 nil
、NULL
或 false
,具体取决于确切的数据类型)。见Objective-C 2.0 Programming Language:
alloc
方法为新对象的实例变量动态分配内存,并将它们全部初始化为 0,也就是说,除了将新实例连接到其类的isa
变量之外。
编辑 2013-05-08 苹果似乎已经删除了上述文件(现在链接到 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()
或realloc()
分配的数据; calloc()
也是如此,因为 calloc()
明确将其分配的内存清零。
一个例外是当启用自动引用计数 (ARC) 时,指向 Objective-C 对象的堆栈指针被隐式初始化为 nil
;但是,将它们显式初始化为nil
仍然是一种很好的做法。来自Transitioning to to ARC Release Notes:
堆栈变量用
nil
初始化使用 ARC,强、弱和自动释放堆栈变量现在隐式初始化为
nil
在 C++(以及 Objective-C++ 中使用的 C++ 对象)中,类实例变量也不零初始化。您必须在构造函数中显式初始化它们。
【讨论】:
正确。然而,人们经常想知道这个细节这一事实足以让我们更明确地初始化变量,可以说是“更安全”的选择。初始化为 0/nil/NULL 永远不会伤害任何人... :-) @PsychoDad 我的经历正好相反。 @Pang:现在已修复。 Apple 遗憾地删除了原始的“Objective-C 2.0 编程语言”文档 AFAICT。 在ARC下id
类型的局部变量也被初始化为nil。
@n00bProgrammer:是的。在上述情况下,所有变量都以对它们各自的数据类型意味着的任何方式“零初始化”。算术类型(int
、NSUInteger
、CGFloat
、float
、bool
、BOOL
、char
等)都被初始化为这些类型中表示的 0。【参考方案2】:
是的,在 C 中,全局变量被初始化为零。 在 Objective-C 中,甚至局部变量也被初始化为零。 你可以指望它。
【讨论】:
@AdamRosenfield 的回答直接与您声称即使本地变量也初始化为零的说法相矛盾。谁错了?【参考方案3】:我认为您不应该为初始化假设任何值。如果您正在围绕“0”值构建逻辑,则应将其设置为确定。
【讨论】:
我认为我们可以将其视为 C++ 的有效答案,而 Adam 的答案适用于 Objective-C? Adam 对 Objective C 的回答是完全正确的 - Objective C 绝对保证 ivars 在分配时设置为 nil/NULL/false/0,接受和使用这一事实是完全明智的。例如,当 NSMultableArray* ivars 被注意到为 nil 时,这可以使用 [NSMultableArray array or new] 进行简单的延迟初始化。结合 Objective C 保证 [(NSMultableArray*) count] 返回 0,您通常可以进一步推迟初始化。学会喜欢 Objective C 的方式,而不仅仅是与它的差异作斗争。以上是关于整数总是初始化为0吗?的主要内容,如果未能解决你的问题,请参考以下文章
在C语言中,为啥定义变量的时候总是初始化为0呢?该怎么理解。