我真的很难过这个。我一直在阅读有关如何正确处理块内变量的所有信息。
注意:我没有使用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;
}];
}];
现在这段代码可能看起来有点武断,但这是一个非常现实的例子,我必须要做的事情。
以下是我的两个问题:
如果我按原样保留此类,并且在调用此块期间取消分配类(尝试),则不会释放。
如果我将self更改为__block typeof (self) weakRef = self;
,那么如果在第二个块可以运行之前该类被释放,则它会崩溃,因为它正在尝试引用我的deallocated self。
我知道我一定不明白这是如何运作的,但是如果有人能说出一些亮点,我会很感激。
答案 0 :(得分:3)
您不必担心内联动画块中对self
的引用所创建的保留周期。动画开始时,块将保留self,并在动画块完成执行时释放它。
想象某人做了一些调用动画的东西。然后,在动画完成之前,他们将该视图控制器从导航堆栈中弹出。导航控制器释放您的控制器,但动画块继续保留它。当动画完成时(屏幕外),该块将释放应该是控制器的最后一个引用,并将被取消分配。