2012-09-17 46 views
4

如果我從一個塊內調用的函數引用「自我」,是否會創建一個保留週期?塊保留週期調用函數

__weak id weakSelf = self; 

- (void)firstFunction 
{ 
    id strongSelf = weakSelf; 
    if (!strongSelf) return; 

    [anObject performBlock:^{ 
     [strongSelf secondFunction]; 
    }]; 
} 

- (void)secondFunction 
{ 
    [self doSomeCrazyStuff]; 
    self.counter++; 
    //etc. 
} 

我在'secondFunction'中調用'self',是否需要將弱指針傳入此函數並使用它?

回答

1

可能。

甲保留週期是由具有強引用一個週期,除了限定符創建(即弱,強)對可變其中這些引用來自實際變量是無關緊要的。因此,您所在區域引用的strongSelf是對self的強烈參考,您可以像保留循環一樣使用self本身。

回覆:評論

有您塊保持弱引用是標準的方法來解決這一問題。如果在塊中使用weakSelf,則沒有強參考,如果在調用該塊時weakSelfnil,則調用[weakSelf secondFunction]將不會執行任何操作 - 您可以在Objective-C中發送消息nil。在塊的調用期間,您不會創建一個循環,但可能會創建一個強引用的副本,但是在調用塊返回後,這個副本將會繼續。

+0

如果我擺脫strongSelf和使用weakSelf調用「secondFunction」,然後會在「secondFunction」的代碼行創建自強引用?我問,因爲'secondFunction'是從一個塊內調用的。 – Thawe

+0

@Thawe - 添加到回答 – CRD

0

我可能是錯的,但我看不到保留週期。

塊被堆棧分配,除非它們被複制到堆中。

我不使用ARC所以你的里程可能會有所不同,但至少沒有ARC時,堆棧中分配塊我就沒有一個保留週期的預期,它已經沒有保留的參考自我。

自參考將被複制到塊堆疊,如果它超出範圍的塊將繼續,直到終止塊訪問副本。

我不認爲知道ARC如何管理這一點,我想,如果你要使用ARC你應該知道自己是如何工作的。

但就非ARC代碼而言,我認爲沒有這個代碼任何挽留週期。