2012-12-06 39 views
7

請考慮以下事項:Objective-C類的實例由一個強引用和一個弱引用(在ARC下)引用。在線程X上,通過弱引用在實例上調用一個方法。在線程Y上,強引用被打破,以致沒有更強的對實例的引用,並且它應該被釋放。當一個實例方法被調用時,Objective-C對象可以被釋放嗎?

這種情況是否可能,因爲當方法在線程X上執行時,可能會在線程Y上釋放對象?同樣,在方法返回之前,是否在對象上調用方法'保留'該對象?

回答

10

ARC在調用實例方法之前確實保留了弱引用,並在調用之後釋放。

我在研究這個問題,並在向他展示了這個計算器問題後被一位同事糾正了。他指出這一點: http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html

確實,在彙編中,ARC保留並釋放一個弱引用的調用。

有一次您想要收聽CLANG_WARN_OBJC_RECEIVER_WEAK是爲零檢查,當nil可能導致錯誤。

if (self.weakRefToParent) { 
    //self.weakRefToParent could be dealloced and set to nil at this line 
    NSString *name = [self.weakRefToParent name]; //CLANG_WARN_OBJC_RECEIVER_WEAK warning 
    [self.namesArray addObject:name]; //name is nil, NSInvalidArgumentException 
} 

這是更安全的方式:

Parent *strongRefToParent = self.weakRefToParent; 
if (strongRefToParent) { 
    NSString *name = [strongRefToParent name]; 
    [self.namesArray addObject:name]; 
} 
+2

更好的答案(如「準確,基於編譯器作者的明確反應」)。謝謝! – bbum

相關問題