为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕盖茨9453107 2019-11-14 14:37:49

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


更具体地说,当int新实例化具有ivars 的对象时,可以安全地假定其ivars的值为0吗?


查看完整描述

3 回答

?
qq_花开花谢_0

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


查看完整回答
反对 回复 2019-11-14
?
慕容3067478

在上述情况下,所有变量对于其各自的数据类型均以“零初始化”的方式表示。算术类型(intNSUIntegerCGFloatfloatboolBOOLchar,等等)都被初始化到在这些类型的代表0。

查看完整回答
反对 回复 2019-11-14
?
FFIVE

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

查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 70 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信