鑑於self在Objective-C中是不安全的,我們可以通常說沒有任何理由對弱對象調用方法或訪問屬性嗎?即。從來沒有做到這一點:有沒有很好的理由來調用弱對象的方法?
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doStuff];
});
當然,在技術上這可能是確定的,如果有另一種強引用自認爲是保證保持在範圍內,直到doStuff被調用後,但是這是一個非常貧窮的原因。
如果沒有什麼好的理由,那麼對編譯器來說簡單地拒絕這樣的調用,至少在編譯器選項後面不是一個好主意?
在回答你的問題時,有很多很好的理由可以使用'weakSelf'模式,但出於實際的原因,在你的例子中沒有什麼目的。據說,我們當然不希望編譯器拒絕這種模式。我們可以輕鬆構建我們想要精確完成的場景。例如,如果這是來自視圖控制器的網絡請求完成處理程序,並且它完成更新模型對象,然後「doStuff」正在更新UI?你可能會做很像你在這裏的東西。 – Rob
這是一個錯字,我的意思是不安全的。 您當然不需要爲網絡請求調用[weakSelf doStuff]。你總是可以做typeof(self)strongSelf = weakSelf; [strongSelf doStuff];顯然,對於弱對象,在doStuff期間對象基本上變得強壯,因此在這種情況下添加強自我將是多餘的。 –
將描述原因的形容詞從「強」和「弱」改爲「好」和「差」,以避免與叮噹記憶管理術語混淆。另外,考慮一個*真正的__weak *引用將毫無意義,因爲它將在賦值後立即釋放。 – danh