[英]Calling function in block retain cycle
如果我從塊內部調用的函數引用“self”,那會創建一個保留周期嗎?
__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',我是否需要將弱指針傳遞給此函數並使用它?
潛在的。
保留周期是通過具有強引用循環來創建的,除了變量上的限定符(即弱,強)之外,這些引用來自的實際變量是無關緊要的。 所以strongSelf
引用您的塊是強引用self
和你有一個保留周期相同的電位,如果你想使用self
本身。
回復:評論
讓您的塊保持弱引用是解決此問題的標准方法。 如果在塊中使用weakSelf
,則沒有強引用,如果在塊調用時, weakSelf
為nil
則調用[weakSelf secondFunction]
將不執行任何操作 - 您可以在Objective-C中發送nil
消息。 您不會創建一個循環,在塊的調用期間可能會創建一個強大的引用副本,但這將在調用該塊后返回。
我錯了,但我看不到保留周期。
塊被分配堆棧,除非它們被復制到堆中。
我不使用ARC,所以你的里程可能會有所不同,但至少沒有ARC,當塊被分配堆棧並且沒有保留對self的引用時,我不會期望保留周期。
對self的引用將被復制到塊堆棧中,如果超出范圍,塊將繼續訪問副本,直到塊終止。
我不想知道ARC如何管理這個,我想如果你打算使用ARC你應該知道它是如何工作的。
但就非ARC代碼而言,我在這段代碼中看不到任何保留周期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.