1

鑑於self在Objective-C中是不安全的,我們可以通常說沒有任何理由對弱對象調用方法或訪問屬性嗎?即。從來沒有做到這一點:有沒有很好的理由來調用弱對象的方法?

__weak typeof(self) weakSelf = self; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [weakSelf doStuff]; 
}); 

當然,在技術上這可能是確定的,如果有另一種強引用自認爲是保證保持在範圍內,直到doStuff被調用後,但是這是一個非常貧窮的原因。

如果沒有什麼好的理由,那麼對編譯器來說簡單地拒絕這樣的調用,至少在編譯器選項後面不是一個好主意?

+0

在回答你的問題時,有很多很好的理由可以使用'weakSelf'模式,但出於實際的原因,在你的例子中沒有什麼目的。據說,我們當然不希望編譯器拒絕這種模式。我們可以輕鬆構建我們想要精確完成的場景。例如,如果這是來自視圖控制器的網絡請求完成處理程序,並且它完成更新模型對象,然後「doStuff」正在更新UI?你可能會做很像你在這裏的東西。 – Rob

+0

這是一個錯字,我的意思是不安全的。 您當然不需要爲網絡請求調用[weakSelf doStuff]。你總是可以做typeof(self)strongSelf = weakSelf; [strongSelf doStuff];顯然,對於弱對象,在doStuff期間對象基本上變得強壯,因此在這種情況下添加強自我將是多餘的。 –

+0

將描述原因的形容詞從「強」和「弱」改爲「好」和「差」,以避免與叮噹記憶管理術語混淆。另外,考慮一個*真正的__weak *引用將毫無意義,因爲它將在賦值後立即釋放。 – danh

回答

2

document你引用:

對於__weak對象,當前的指針對象被保持並且然後在當前滿表達的端部釋放。這必須以原子方式執行任務和指出對象的最終版本。

換句話說,weakSelfdoStuff方法期間會自動保留,所以它很安全。

通常,如果您調用多個方法/屬性,則會將弱引用轉換爲強引用。

+0

好的。我的問題來自這個問題的答案:http://stackoverflow.com/questions/32468758/objective-c-arc-does-a-method-retain-self。那我認爲那些答案是錯誤的。 –

-1

可我們一般說,沒有強有力的理由來調用過弱對象

不,那是沒有意義的方法或訪問屬性。你總是調用弱方法的方法!例如,在Cocoa中,大多數delegate對象都是weak - 因爲它們需要這樣做,因爲對象保留其委託將是錯誤的。然而,在委託上調用方法是委託模式的本質;否則,什麼是代表

舉例:這裏的UIApplication的delegate如何聲明:

@property(nullable, nonatomic, assign) id<UIApplicationDelegate> delegate; 

這是一個非ARC弱引用(這就是assign手段)。然而,你永遠不會說沒有消息可以發送到應用程序代表,你會嗎?

+0

永遠不要在弱對象上調用方法並不意味着你永遠不會使用它們。這隻意味着你必須首先讓它們變得強大。但正如達倫指出的那樣,編譯器已經爲你做了這件事。 –

+0

但我不相信。編譯器不會讓弱代理變得強大。相反,向不再存在的「委託」發送消息是經典的「懸掛指針」崩潰情況。這是_unsafe_。沒有什麼能讓它變強如果是的話,我們不會崩潰。但這不是一個愚蠢或不好的情況;你只需要採取措施保證安全。確保代表超出對象的參照範圍只是您工作的一部分,就這些。但要說這不是一個薄弱的參考就是胡說八道。當然它很弱。 – matt

+0

對於文檔中的一部分,你不相信什麼?對於__弱對象,當前指針被保留,然後在當前完整表達式結束時釋放。如果它被保留,那麼它將不會被釋放(就像引用它的強變量一樣)。如果代理人被釋放,弱引用將變爲零。使用零對象不會崩潰,除非你做了特定的事情,比如將它添加到數組或直接訪問伊娃。這是一個完全獨立的討論,而不是這裏的問題。 –

相關問題