我真的被这个难住了。我一直在阅读有关如何正确处理块内变量的所有信息。
注意:我没有使用弧。
所以,假设我有一个看起来像这样的动画:
[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;
then 如果类在第二个块可以运行之前被释放,它会崩溃,因为它试图引用我释放的 self。
我知道我只是不明白这是如何工作的,但如果有人能解释一下,我将不胜感激。