ARC在哪里写下发布说明?

时间:2015-09-01 20:47:05

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

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

  1. Xcode确实唤醒ARC
  2. ARC分析我的代码并编写所有retain/release/autorelease次调用
  3. 最后代码由LLVM编译
  4. 在这个过程中会发生一些事情,但我要问的是......

    ARC在哪里写下发布说明?

    1. 在引用类实例的变量超出范围
    2. 之前
    3. 在该变量使用
    4. 的最后一次之后

      实施例

      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

      我怀疑在足迹方面可能会有重要影响,但我找不到任何有关此问题的信息。

1 个答案:

答案 0 :(得分:3)

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

致你的问:

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

答案很长:

语义上,当本地var的范围丢失时,将发送本地var(本地范围,auto)的发布。但这是优化的。因此,从技术上讲,可能需要更早发送,这意味着在本地var的最后一次可见使用和范围的丢失之间。

如果您有理由在保留范围内保留保留期限,则必须注释objc_precise_lifetime

  

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

     

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

     

[...]

     

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

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