我知道,當我們使用block時,我們應該使用weakSelf來避免保留週期。但是我有時候看到block中有一個強烈的self。我們應該什麼時候把弱者變成強者?
什麼讓我感到困惑是:
- 爲什麼必須改變weakSelf到strongSelf?
- 如果我們不改變自我強壯自己會發生什麼樣的可怕事情?
- 什麼時候我們應該把弱自我轉變爲強自我?
希望有人可以舉一個確切的例子。
在此先感謝。
我知道,當我們使用block時,我們應該使用weakSelf來避免保留週期。但是我有時候看到block中有一個強烈的self。我們應該什麼時候把弱者變成強者?
什麼讓我感到困惑是:
希望有人可以舉一個確切的例子。
在此先感謝。
有時你希望你的塊不執行,如果對自己的引用已經爲零(用戶駁回視圖)。這就是你首先使用弱引用的原因。 (通常情況下)
但是,有時候你希望你的塊完成執行,確保所有的東西它的引用是活的,但一旦塊已經開始只有「自己」還活着。在這種情況下,您可以將塊轉換爲強參考。 (RARE CASE)
如果塊在self處於活動狀態(允許它開始)時開始執行,但在處理過程中(在考慮諸如圖像處理等耗時的功能時)釋放,然後塊訪問資源從自我(不再存在)它會崩潰。
幾乎從不。我能想到的唯一例子就是當你的塊在開始執行時絕對需要來自「自我」的資源。
有這個答案更詳細的解釋:
我可以說變化weakSelf到strongSelf更加安全比只使用weakSelf ? –
是的,只要你在塊的開頭檢查'self'存在。但這是一個非常罕見的情況,一旦你進入了這個街區,自我消失了。 (閱讀鏈接的問題 – Pochi
「,然後塊從自我訪問資源(不再存在),它會崩潰。」這取決於你的意思是「訪問資源」,在這種情況下,它可以訪問它'weakSelf'(而不是'self'),當指向的對象被釋放時它將成爲'nil'。調用方法或訪問'nil'指針的屬性(調用方法)不會崩潰。你直接使用'weakness'上的' - >'來訪問實例變量,如果它是'nil',它會崩潰。 – newacct
的唯一原因捕捉self
,作爲弱或強引用,在一個塊是因爲該塊使用它以某種方式 。
當self
被弱拍時,如何使用它將決定何時以及是否需要首先製作強大的副本。
如果塊要多次使用捕獲的引用,那麼應該始終創建一個強副本,這將確保引用在塊內的所有用途中保持活動狀態,並避免多次加載弱引用的成本。
例如,在塊的功能取決於self
是否仍然存在,那麼通常先做一個強引用並測試它。沿着線的東西:
__weak __typeof(self)weakSelf = self;
myBlock = ^{
// make local strong reference to self
__typeof(weakSelf) strongSelf = weakSelf;
// check if self still exists and process accordingly
if (strongSelf)
{
// do whatever is needed if "self" still exists
// strongSelf will keep the object alive for the
// duration of the call
}
else
{
// do whatever, if anything, is needed if "self" no longer exists
}
});
但是,如果塊的操作僅可選擇需要使用由self
再強的副本可能永不會被引用的對象。
HTH
https://stackoverflow.com/questions/11013587/differences-between-strong-and-weak-in-objective-c –