1

我真的为这个难住。我一直在阅读所有关于如何正确处理块内变量的信息。如何避免在iOS上延迟阻止调用的保留周期

注:我没有使用弧。

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

[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;,那么如果该类在第二个块可以运行之前被释放,它将崩溃,因为它试图引用我的已释放自我。

我知道我只是不明白这是如何工作,但如果任何人都可以摆脱一些光,我将不胜感激。

+1

你的两个问题是不兼容的。无论是动画块延长'self'的寿命,还是'self'死在中间,动画块开始引用一个垃圾对象。第一个“问题”通常被认为是一个特征。 – 2013-03-18 21:46:53

+0

@KevinBallard延长寿命会很好。但完全不能解除分配是不行的。我不确定你的意思是“垃圾对象”,因为我没有使用弧。它只是崩溃。我需要一些方法来取消块调用或...我需要我的变量以某种方式返回零时,它会尝试调用,以避免崩溃。 – daveMac 2013-03-18 21:51:44

+7

它不会让对象永远不会释放。一旦完成块被触发,它就会释放对'self'的引用,释放它。如果你看到对象*永远不会被释放,那么你还有其他事情正在进行。 – 2013-03-18 21:53:04

回答

3

您不应该担心在内嵌动画块中引用self创建的保留周期。该块在动画开始时将保留自己,并在动画块完成执行时释放它。

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

+0

感谢您的解释。我在凯文巴拉德的评论的帮助下解决了这个问题。 – daveMac 2013-03-19 16:39:46

相关问题