And*_*ann 5 macos objective-c ios xcode4 automatic-ref-counting
特别是,这种代码总是按预期工作(其中MyResourceGuard是一个对象,它在其init方法中锁定独占资源并释放其dealloc方法中的锁):
NSLog(@"About to capture some exclusive resource.");
{
MyResourceGuard* guard = [MyResourceGuard new];
// Do something with the exclusive resource here.
}
// guard is out of scope, therefore its dealloc should have
// been called right away and the resource should already
// be free again at this point.
Run Code Online (Sandbox Code Playgroud)
我已阅读书籍和博客,与例如Java垃圾收集相反,ARC一旦引用计数减少到零就会销毁对象(而不是在它自己方便的某个时间),但我没有在任何官方读过这个Apple提供的文档.如果这是真的,为什么我们需要在ARC中引入新的@autoreleasepool关键字?
从调试开始,我总是看到对象dealloc'ed立即,除非在try-catch-block中引发异常,在这种情况下dealloc实际上从未被调用(是Mac bug,或者只是这些可怕的目标之一) C古怪?).
不会.您的示例显示,您没有基于确定性范围的ObjC对象销毁.
例如,该程序可能导致死锁:
{ MyResourceGuard* guard = [MyResourceGuard new]; }
{ MyResourceGuard* guard = [MyResourceGuard new]; }
Run Code Online (Sandbox Code Playgroud)
如果需要此功能,最好的办法是使用C++类型(SBRM,RAII) - 也可以在Objective-C++中使用(但不适用于objc对象).
它接近,但你必须等到引用计数达到零-dealloc才能被调用,这就是保证关闭的原因(通常是!=总是).这个问题实际上非常类似于你永远不会依赖或使用的原因-retainCount(可用的地方).示例:自动释放池,异常,对运行时或ARC生成的代码的更改,编译器优化,使用具有不同代码生成标志的实现可能导致objc对象的生命期延长超出范围.
更新
在clang网站上ARC的整个页面是关于这个主题的一个很好的阅读 - 包括细节,保证(和缺乏保证),但特别是:
6.1.精确的生命周期语义
通常,ARC维护一个不变量,即在__strong对象中保留的可保留对象指针将保留对象的完整形式生命周期.受此不变量影响的对象具有精确的生命周期语义.
默认情况下,自动存储持续时间的局部变量没有精确的生命周期语义.这些对象只是包含可保留对象指针类型值的强引用,并且这些值仍然完全受本地控制下的值的优化.
理由:严格地应用这些精确寿命语义将是令人望而却步的.理论上可能会减少对象生命周期的许多有用的优化将变得不可能.从本质上讲,它承诺太多了.
可保留对象所有者类型和自动存储持续时间的局部变量可以使用objc_precise_lifetime属性进行注释,以指示它应该被视为具有精确生命周期语义的对象.
基本原理:尽管如此,即使该对象似乎没有被使用,有时也能够强制在精确的时间释放对象.这可能是不常见的,明确请求这些语义的语法权重不会是繁重的,甚至可能使代码更清晰.
即使您使用该objc_precise_lifetime属性,它也将应用于该强局部变量的引用计数操作- 而不是对象的生命周期.