为什么使用弱引用时ARC会自动释放?

时间:2013-05-11 02:07:27

标签: objective-c automatic-ref-counting

为什么ARC不能使用常规版本?

示例:

[weakObject doSomething];

根据我的理解,ARC将其变为:

Object *strongObject = objc_autorelease(objc_loadWeakRetained(weakObject));
[strongObject doSomething];

为什么ARC不这样做呢?:

Object *strongObject = objc_loadWeakRetained(weakObject);
[strongObject doSomething];
objc_release(strongObject);

我想尽可能多地消除ARC中的自动释放。我用GCD做了很多异步线程,最后我不得不添加自动释放池:

dispatch_async(self.myQueue, ^{
    @autoreleasepool{
        [weakObject doSomethingBig];
    }
});

1 个答案:

答案 0 :(得分:2)

我无法解释为什么ARC编译器会这样做,但是 如果我正确理解生成的汇编代码,请使用以下模式

dispatch_async(self.myQueue, ^{
    Object *strongObject = weakObject;
    [strongObject doSomething];
});

被翻译为objc_loadWeakRetained(),...,objc_release(),以便对象 没有被放入自动释放池。