2013-05-11 8 views
6

ARCで通常のリリースを使用できないのはなぜですか?弱参照を使用するときに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でできるだけ多くのオートリアーゼを排除するのが好きです。私が正しく生成されたアセンブリコードを理解していれば

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

十分にスマートなコンパイラの欠如は、基本的には、おそらくそれは提出されており、間違いなく知られていますが、バグレポートの価値があるかもしれません。 –

+0

弱点はどこから得ますか? –

答えて

2

ARCコンパイラは、この方法それをしない理由を私は説明できませんが、 :私はGCDとスレッドの非同期の多くを行うと、私は自動解放プールをたくさん追加することに終わります、次のパターン

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

を使用すると、objc_loadWeakRetained()に翻訳されて...、objc_release()、オブジェクト は、自動解放プールに入れないように。

関連する問題