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 に答える