回答
是的,类实例变量始终初始化为0(或者nil
,NULL
或false
,具体取决于确切的数据类型)。见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++)中使用,类的实例变量也不零初始化。你必须在你的构造函数中明确地初始化它们。
我不认为你应该承担任何初始值。如果围绕“0”值构建逻辑,则应将其设置为确定。
我认为我们可以看到这是C++的有效答案,而Adam的答案适用于Objective-C? – Felixyz 2009-06-13 15:41:42
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
是的,在C全局变量初始化为零。在Objective-C中,即使局部变量也被初始化为零。 你可以依靠它。
- 1. 初始化向量与INTS
- 2. 将int初始化为0还是不?
- 3. 结构初始化为0
- 4. UNIX初始化进程是否始终运行
- 5. Readystate始终为0
- 6. PerformaceCounter始终为0
- 7. indexPath.row始终为0
- 8. FREETEXTTABLE始终为0
- 9. resultCode始终为0
- 10. 非显式初始化成员在其成员初始化的结构中始终为0?
- 11. c struct的成员是否保证被初始化为0?
- 12. Javascript类型的数组是否已初始化为0?
- 13. 初始化类具有{0}
- 14. 初始化变量的初始化是否正确?
- 15. 重新初始化或检查菜单是否被初始化
- 16. 最终变量初始化
- 17. free()的内存初始化为0
- 18. 大阵列初始化为0
- 19. 强制int初始化为0 msvC++
- 20. 默认初始化整数成员是否为空初始化程序?
- 21. 初始化多维数组:{0}与{{{0}}}
- 22. 初始化std :: map中的原始类型的值是否已初始化?
- 23. CUDA输出始终为0
- 24. GLSL gl_PrimitiveID始终为0
- 25. onActivityResult - resultCode始终为0
- 26. Keyboard event.charCode始终为0
- 27. SolrNet - 得分始终为0
- 28. 行数始终为0
- 29. Field _id始终为0
- 30. ABMultiValueIdentifier始终为0(零)ABPeoplePicker
现货。然而,人们经常对这个细节感到疑惑的事实足以使变量初始化更明确,可以说是“更安全”的选择。初始化为0/nil/NULL从不伤害任何人...... :-) – 2009-06-13 16:36:30