6

为什么 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];
    }
});
4

1 回答 1

2

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

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

被翻译成objc_loadWeakRetained(), ..., objc_release(),这样对象就不会被放入自动释放池中。

于 2013-05-11T02:36:45.267 回答