7
請考慮以下事項:Objective-C類的實例由一個強引用和一個弱引用(在ARC下)引用。在線程X上,通過弱引用在實例上調用一個方法。在線程Y上,強引用被打破,以致沒有更強的對實例的引用,並且它應該被釋放。當一個實例方法被調用時,Objective-C對象可以被釋放嗎?
這種情況是否可能,因爲當方法在線程X上執行時,可能會在線程Y上釋放對象?同樣,在方法返回之前,是否在對象上調用方法'保留'該對象?
請考慮以下事項:Objective-C類的實例由一個強引用和一個弱引用(在ARC下)引用。在線程X上,通過弱引用在實例上調用一個方法。在線程Y上,強引用被打破,以致沒有更強的對實例的引用,並且它應該被釋放。當一個實例方法被調用時,Objective-C對象可以被釋放嗎?
這種情況是否可能,因爲當方法在線程X上執行時,可能會在線程Y上釋放對象?同樣,在方法返回之前,是否在對象上調用方法'保留'該對象?
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];
}
更好的答案(如「準確,基於編譯器作者的明確反應」)。謝謝! – bbum