0

我有一個問題,這可能是相當普遍的。在ARC環境中,需要引用自我的塊將超出自我。我知道在塊中使用__weak typeof(self) weakSelf = self;以避免保留週期。問題是我們確實需要保持自我。所以我的問題是:什麼時候在塊中引用self會創建一個保留週期? This post帖子顯示,在動畫塊中,引用自我是可以的。什麼時候在塊中引用自我保留週期?

我還審議了類似下面的解決辦法,但我不知道它改變任何東西:

__block typeof(self) blockSelf = self; 

[someObj someMethodTakingCallback:^{ 
    //do some stuff 
    blockSelf = nil; 
}]; 

回答

3

你得到一個參考週期,如果self保留,除了擋護`自我塊。

+0

我想接下來的問題是「什麼時候自我保留塊?」我假設在上面的例子中 - 將一個塊傳遞給另一個對象來執行 - 事實並非如此。正確? –

+0

沒有看到更多的餘地,你發佈的代碼應該不會導致'self'保留塊。 – rmaddy

0

在這種情況下,如果自成立以來someObj中可能是抱着自己的引用someObj中引用你將有一個保留週期。如果有任何從self到someObj的保留參考路徑,它實際上是一個保留週期。

+0

你爲什麼說'someObj'可能是抱着'self'參考,如果'self'持有到'someObj'參考。這是沒有意義的。 – rmaddy

+0

someObj中持有的塊的參考塊絕對擁有自我參考(這是可能的參考,我們可以僅基於我們在這裏看到無法確定)。因此someObj可能持有(間接)引用自我。 –

+0

如果除了從someObj到self的間接引用,還有從self到someObj的保留路徑(例如,如果someObj實際上是自己的屬性或實例變量,則「循環」部分發揮作用 –

相關問題