首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在iOS上延迟块调用来避免保留周期

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

Stack Overflow用户
提问于 2013-03-18 21:45:11
回答 1查看 1K关注 0票数 1

我真的对这件事感到困惑。我一直在阅读关于如何正确处理块内变量的所有信息。

注:我不使用弧形。

所以,假设我有一个动画,看起来是这样的:

代码语言:javascript
复制
[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. 如果我将self更改为__block typeof (self) weakRef = self;,那么如果类在第二个块运行之前被解除分配,它就会崩溃,因为它试图引用我的已分配的self。

我知道我只是不明白这是怎么回事,但如果有人能给我一些启发,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 16:12:09

您不应该担心内联动画块中对self的引用所创建的保留周期。当动画开始时,块将保留self,并在动画块完成执行时释放它。

想象一下,有人做的事情会调用你的动画。然后,在动画完成之前,他们从导航堆栈中弹出该视图控制器。导航控制器释放控制器,但是动画块继续保留它。当动画完成(离屏幕)时,块将释放应该是对控制器的最后引用的内容,并且它将被释放。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15487549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档