我每次在键盘上按 CMD + B 时都知道:
retain/release/autorelease
次调用在这个过程中会发生一些事情,但我要问的是......
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
?我怀疑在足迹方面可能会有重要影响,但我找不到任何有关此问题的信息。
答案 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