簡體   English   中英

如何在iOS上延遲塊調用來避免保留周期

[英]How to avoid retain cycle with delaying block invocation on iOS

我真的很難受這個。 我一直在閱讀有關如何正確處理塊內變量的所有信息。

注意:我沒有使用arc。

所以,假設我有一個看起來像這樣的動畫:

[UIView animateWithDuration:.5 animations:^{
    textCard.alpha = 1.f;
    self.dotView.alpha = 1.f;
    self.subtitles.alpha = 0;
}completion:^(BOOL finished){
    [self.playerLayer removeFromSuperlayer];
    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.vidPlayer];
    self.playerLayer.frame = self.vidView.bounds;
    [self.vidView.layer insertSublayer:self.playerLayer atIndex:0];
    [self.subtitles removeFromSuperview];
    self.subtitles = [sub autorelease];

    [UIView animateWithDuration:.3 delay:1 options:UIViewAnimationOptionAllowUserInteraction animations:^{
        textCard.alpha = 0.f;
        sub.alpha = 1.f;
    }completion:^(BOOL finished){
        self.queuedVid = NO;
        if (self.shouldPlay == YES) {

            [self.vidPlayer play];
            [self setCurrentVideoSettings];
        }
        else{
            self.shouldPlay = YES;
        }

        [textCard removeFromSuperview];
        textCard = nil;
    }];
    }];

現在這段代碼可能看起來有點武斷,但這是一個我必須做的事情的真實世界的例子。

這是我的兩個問題:

  1. 如果我保持原樣,並且在調用此塊期間類(嘗試)被取消分配,則不會釋放。

  2. 如果我把自己改為__block typeof (self) weakRef = self; 然后,如果在第二個塊可以運行之前該類被釋放,它會崩潰,因為它試圖引用我的deallocated self。

我知道我一定不能理解這是如何運作的,但如果有人能說出一些亮點,我將不勝感激。

您不必擔心在內聯動畫塊中通過引用self創建的保留周期。 動畫開始時,塊將保留self,並在動畫塊完成執行時釋放它。

想象一下有人做了一些調用動畫的東西。 然后,在動畫完成之前,他們將該視圖控制器從導航堆棧中彈出。 導航控制器釋放您的控制器,但動畫塊繼續保留它。 當動畫完成時(屏幕外),該塊將釋放應該是控制器的最后一個引用,並且它將被釋放。

暫無
暫無

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

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