2017-07-13 55 views
1

我知道,當我們使用block時,我們應該使用weakSelf來避免保留週期。但是我有時候看到block中有一個強烈的self。我們應該什麼時候把弱者變成強者?

什麼讓我感到困惑是:

  1. 爲什麼必須改變weakSelf到strongSelf?
  2. 如果我們不改變自我強壯自己會發生什麼樣的可怕事情?
  3. 什麼時候我們應該把弱自我轉變爲強自我?

希望有人可以舉一個確切的例子。

在此先感謝。

+0

https://stackoverflow.com/questions/11013587/differences-between-strong-and-weak-in-objective-c –

回答

1
  1. 爲什麼要變弱自我爲強自己呢?

有時你希望你的塊不執行,如果對自己的引用已經爲零(用戶駁回視圖)。這就是你首先使用弱引用的原因。 (通常情況下)

但是,有時候你希望你的塊完成執行,確保所有的東西它的引用是活的,但一旦塊已經開始只有「自己」還活着。在這種情況下,您可以將塊轉換爲強參考。 (RARE CASE)

  1. 如果我們不改變自我強壯自己會發生什麼樣的可怕事情?

如果塊在self處於活動狀態(允許它開始)時開始執行,但在處理過程中(在考慮諸如圖像處理等耗時的功能時)釋放,然後塊訪問資源從自我(不再存在)它會崩潰。

  1. 什麼時候我們應該把弱自我轉變爲強自我?

幾乎從不。我能想到的唯一例子就是當你的塊在開始執行時絕對需要來自「自我」的資源。

有這個答案更詳細的解釋:

Strong reference in the block, it will be retained?

+0

我可以說變化weakSelf到strongSelf更加安全比只使用weakSelf ? –

+0

是的,只要你在塊的開頭檢查'self'存在。但這是一個非常罕見的情況,一旦你進入了這個街區,自我消失了。 (閱讀鏈接的問題 – Pochi

+0

「,然後塊從自我訪問資源(不再存在),它會崩潰。」這取決於你的意思是「訪問資源」,在這種情況下,它可以訪問它'weakSelf'(而不是'self'),當指向的對象被釋放時它將成爲'nil'。調用方法或訪問'nil'指針的屬性(調用方法)不會崩潰。你直接使用'weakness'上的' - >'來訪問實例變量,如果它是'nil',它會崩潰。 – newacct

2

的唯一原因捕捉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

相關問題