1

我真的被这个难住了。我一直在阅读有关如何正确处理块内变量的所有信息。

注意:我没有使用弧。

所以,假设我有一个看起来像这样的动画:

[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. 如果我将 self 更改为 __block typeof (self) weakRef = self;then 如果类在第二个块可以运行之前被释放,它会崩溃,因为它试图引用我释放的 self。

我知道我只是不明白这是如何工作的,但如果有人能解释一下,我将不胜感激。

4

1 回答 1

3

您不必担心self内联动画块引用创建的保留周期。该块将在动画开始时保留自身,并在动画块执行完毕时释放它。

想象一下有人做了一些调用你的动画的事情。然后,在动画完成之前,他们将该视图控制器从导航堆栈中弹出。导航控制器释放您的控制器,但动画块继续保留它。当动画完成时(屏幕外),块将释放对控制器的最后一个引用,并将被释放。

于 2013-03-19T16:12:09.810 回答