簡體   English   中英

在塊保持循環中調用函數

[英]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 ,則沒有強引用,如果在塊調用時, weakSelfnil則調用[weakSelf secondFunction]將不執行任何操作 - 您可以在Objective-C中發送nil消息。 您不會創建一個循環,在塊的調用期間可能會創建一個強大的引用副本,但這將在調用該塊后返回。

我錯了,但我看不到保留周期。

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

我不使用ARC,所以你的里程可能會有所不同,但至少沒有ARC,當塊被分配堆棧並且沒有保留對self的引用時,我不會期望保留周期。

對self的引用將被復制到塊堆棧中,如果超出范圍,塊將繼續訪問副本,直到塊終止。

我不想知道ARC如何管理這個,我想如果你打算使用ARC你應該知道它是如何工作的。

但就非ARC代碼而言,我在這段代碼中看不到任何保留周期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM