我真的为这个难住。我一直在阅读所有关于如何正确处理块内变量的信息。如何避免在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;
}];
}];
下面这段代码可能看起来有点武断,但这里的东西我必须做一个非常真实世界的例子。
这里是我的两个问题:
如果我离开这个因为是和类(尝试)此块的调用过程中得到释放,也不会释放。
如果我将自己更改为
__block typeof (self) weakRef = self;
,那么如果该类在第二个块可以运行之前被释放,它将崩溃,因为它试图引用我的已释放自我。
我知道我只是不明白这是如何工作,但如果任何人都可以摆脱一些光,我将不胜感激。
你的两个问题是不兼容的。无论是动画块延长'self'的寿命,还是'self'死在中间,动画块开始引用一个垃圾对象。第一个“问题”通常被认为是一个特征。 – 2013-03-18 21:46:53
@KevinBallard延长寿命会很好。但完全不能解除分配是不行的。我不确定你的意思是“垃圾对象”,因为我没有使用弧。它只是崩溃。我需要一些方法来取消块调用或...我需要我的变量以某种方式返回零时,它会尝试调用,以避免崩溃。 – daveMac 2013-03-18 21:51:44
它不会让对象永远不会释放。一旦完成块被触发,它就会释放对'self'的引用,释放它。如果你看到对象*永远不会被释放,那么你还有其他事情正在进行。 – 2013-03-18 21:53:04