2013-05-11 131 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中的儘可能多的autoreleases。我做了很多異步線程與GCD,我最終不得不添加自動釋放池了很多:

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

基本上缺乏足夠智能的編譯器。可能值得一個錯誤報告,雖然它可能已被提交,並且是絕對已知的。 – 2013-05-11 03:07:53

+0

你從哪裏得到weakObject? – 2013-05-11 03:58:34

回答

2

我無法解釋爲什麼ARC編譯器是這樣,但 如果我理解正確生成的彙編代碼使用以下方式

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

被翻譯成objc_loadWeakRetained(),...,objc_release(),使對象 不放入自動釋放池。

相關問題