【问题标题】:Is Objective-C under ARC guaranteed to initialize statics and ivars to zero?ARC下的Objective-C是否保证将statics和ivars初始化为零?
【发布时间】:2017-05-25 14:52:03
【问题描述】:

查看 Apple 官方的 Transitioning to ARC 文档,它说“堆栈变量”现在已初始化为零值。然而,在我的快速、非正式的测试中,静态变量和 ivars 似乎也被初始化为零;有些人表示他们绝对会自动归零。但是静态变量和 ivars 不是堆栈变量。 Apple 是否发布了关于静态变量和 ivars 的不同法令?

另外,函数内的静态初始化和函数外的静态初始化有区别吗?

【问题讨论】:

    标签: objective-c initialization automatic-ref-counting


    【解决方案1】:

    static 变量由于语言的语义而被清零——作为 C 的严格超集,行为是有保证的。 ivars are also guaranteed to be zeroed out upon initialization(见第 3 条)。

    【讨论】:

    • 另外,由于 Objective-C 语言的语义,ivars 总是初始化为零。早在 ARC 存在之前,这就是事实,IIRC。
    • 那么为什么 Swift 被卖给我们,因为它具有要求所有变量都初始化为值的重要特性?仅仅因为零有时不是理想值?
    • @Q453 - 一种语言是否应该在使用前要求显式初始化/赋值(如在 Swift 中)或支持默认初始值(如在 Objective-C 中)是一场哲学/宗教辩论,双方都有争论——这里就不介绍了!但是对于一种语言实现对这场辩论的有趣贡献see here
    • @Q453:正如在其他 cmets 中所指出的,有很多哲学可以深入探讨。但是为了简洁地涵盖关键的 Swift 差异:1)ObjC 中的“安全”特性随着时间的推移而增加,因此并不存在于所有开发环境和部署目标中,但从一开始就存在于 Swift 中,以及 2 ) Swift 的立场是“初始化为由语言/编译器/运行时定义的值”和“初始化为程序员定义的值”之间存在差异,并强制执行后者。
    猜你喜欢
    • 2021-04-05
    • 2021-09-11
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多