如何避免在iOS上延迟块调用的保留周期

我真的很难过这个。 我一直在阅读所有关于如何正确处理块内variables的信息。

注意:我不使用弧。

所以说,我有一个这样的animation:

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

我知道我一定不明白这是如何运作的,但是如果有人能够说出点亮的话,我将不胜感激。

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

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