我真的对这件事感到困惑。我一直在阅读关于如何正确处理块内变量的所有信息。
注:我不使用弧形。
所以,假设我有一个动画,看起来是这样的:
[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。我知道我只是不明白这是怎么回事,但如果有人能给我一些启发,我会很感激的。
发布于 2013-03-19 16:12:09
您不应该担心内联动画块中对self的引用所创建的保留周期。当动画开始时,块将保留self,并在动画块完成执行时释放它。
想象一下,有人做的事情会调用你的动画。然后,在动画完成之前,他们从导航堆栈中弹出该视图控制器。导航控制器释放控制器,但是动画块继续保留它。当动画完成(离屏幕)时,块将释放应该是对控制器的最后引用的内容,并且它将被释放。
https://stackoverflow.com/questions/15487549
复制相似问题