【问题标题】:Where does ARC write the release instructions?ARC 在哪里写发布说明?
【发布时间】:2015-09-01 20:47:04
【问题描述】:

我知道每次我在键盘上按 CMD + B

  1. Xcode 确实唤醒了 ARC
  2. ARC 分析我的代码并编写所有 retain/release/autorelease 调用
  3. 代码终于被LLVM编译了

在这个过程中还发生了一些事情,但是我要问的是......

ARC在哪里写发布说明?

  1. 就在引用类实例的变量超出范围之前
  2. 就在上次使用该变量之后

示例

class HugeObject {
    func doVeryImportantStuff() { print("The answer is \((10*4)+2)") }
}

func foo() {
    let a = HugeObject()
    a.doVeryImportantStuff()

    // <-- Point A

    let b = HugeObject()
    b.doVeryImportantStuff()

    // <-- Point B
}

ARC 将在哪里写入 a.release() 行?

  • Point B?
  • 或者,更好的是,它能够理解a.release 可以安全地移动到Point A

我怀疑足迹可能会产生重要影响,但我找不到任何相关信息。

【问题讨论】:

    标签: objective-c swift memory-management automatic-ref-counting


    【解决方案1】:

    首先:ARC是编译器的一部分,它的名字叫clang,而不是LLWM。它是在编译时完成的。


    致你的问题:

    简短回答:这取决于您为编译器提供的注释。默认不会太早也不会太晚。

    长答案:

    当本地变量的范围丢失时,发送本地变量(本地范围,自动)的释放。但这是优化的。因此,从技术上讲,可能会更早发送版本,这意味着在本地 var 的最后一次可见使用和范围丢失之间。

    如果你有理由将retain保留到extent,你必须注解objc_precise_lifetime

    通常,ARC 维护一个不变量,即 __strong 对象中的可保留对象指针将在对象的完整正式生命周期内保留。受此不变量约束的对象具有精确的生命周期语义。

    默认情况下,自动存储持续时间的局部变量没有精确的生命周期语义。这些对象只是简单的强引用,它保存可保留对象指针类型的值,并且这些值仍然完全受制于本地控制下的值的优化。

    […]

    可保留对象所有者类型和自动存储持续时间的局部变量可以使用 objc_precise_lifetime 属性进行注释,以指示应将其视为具有精确生命周期语义的对象。

    http://clang.llvm.org/docs/AutomaticReferenceCounting.html#precise-lifetime-semantics

    【讨论】:

    • 感谢您的回答。只是一个问题:你纠正我写的首先:ARC是编译器的一部分,它的名字是clang,而不是LLVM。所以如果编译器的名字是clang 那么为什么我在 Apple 网站上看到 使用令人难以置信的高性能 LLVM 编译器、Swift 代码...用于 C、C++ 和 Objective-C 的强大开源 LLVM 编译器内置在 Xcode 中,可从终端访问。?来源:developer.apple.com/swiftdeveloper.apple.com/xcode/features
    • 1.不要使用 Apple 的文档来解决有关编译器(和语言)的问题。始终使用 clang 的文档。 2. clang 是 LLVM 项目的 Objective-C 前端。所以它是一个名为 clang 的 LLVM 编译器。 Xcode 附带的版本总是编译成机器码。 (所以它不是纯粹的前端,而是一个完整的编译器。) 3. 甚至不属于这个主题:Apple 的关于 Swift 的文档是简单的广告。他们所做的一切都是为了让 Swift 流行起来,包括让 Objective-C 变得更糟。直到今天他们都失败了。但我相信苹果会做得更多。
    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多