繁体   English   中英

无__弱自我-为什么会发生?

[英]nil __weak self - Why it's happend?

我想在区块中使用弱自我,但是在区块中,这个弱自我变成零

刚创建,在块之前(尝试使用不同的变体)-看起来一切正常

在此处输入图片说明

但是稍后-每种变体为零

在此处输入图片说明

做错了什么? 谁能解释?

编辑

SPHVideoPlayer *videoPlayer = [[SPHVideoPlayer alloc] initVideoPlayerWithURL:urlToFile];
[videoPlayer prepareToPlay];

初始化

#pragma mark - LifeCycle

- (instancetype)initVideoPlayerWithURL:(NSURL *)urlAsset
{
    if (self = [super init]) {
        [self initialSetupWithURL:urlAsset];
    }
    return self;
}

- (void)initialSetupWithURL:(NSURL *)url
{
    NSDictionary *assetOptions = @{ AVURLAssetPreferPreciseDurationAndTimingKey : @YES };
    self.urlAsset = [AVURLAsset URLAssetWithURL:url options:assetOptions];
}

还有使用块的方法

- (void)prepareToPlay
{
    __weak typeof(self) weakSelf = self;
    __weak SPHVideoPlayer *weakSealf2 = self;
    NSArray *keys = @[@"tracks"];
    [self.urlAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf startLoading];
        });
    }];
}

正如rckoenes所建议的,此SPHVideoPlayer超出范围并正在发布。 假设您不希望将其发布,则只需选择一个范围使其保持不变(例如,使其成为显示视频的视图控制器的属性)。

您描述了使用weakSelf来防止“保留周期”(现在通常称为“强参考周期”)。 是的, weakSelf模式用于防止强参考循环。 从技术上讲,尚不清楚您是否一定有一个强大的参考周期。 它取决于loadValuesAsynchronousForKey...实现的详细信息(例如,是否将此块加载到某些类属性中,从而创建了从类到其self的块类属性引用的强引用循环,而后者又维护了对self的强引用。 self )。

但这有点学术性: weakSelf模式仍然是谨慎的,因为它可以准确地反映适当的对象图(该块没有业务“拥有”和/或对视频播放器的强烈引用)。 巧合的是,当您使用weakSelf ,它也消除了强参考循环的潜在风险。

真正的问题是,您可能不仅希望在加载资产时而且还在视频播放时将视频播放器保持在范围内,所以无论如何(想要与展示视频播放器的视图控制器。

这就是弱变量的想法:弱变量保存引用计数,因此,如果仅保留弱变量,则该对象将被保留,而弱变量将为nil。 这就是弱变量应该如何工作和应该如何使用的方式的100%。

如果您使用了强大的参考,那么您的代码块将是仍然保留在self上的唯一代码,并且您对self所做的所有工作将毫无意义,因为没有其他人会注意到它。 由于您使用的是弱变量,因此可以通过检查变量是否为nil来避免这种情况。

在多线程环境中,上一个强引用可能随时消失,而弱引用可能随时变为零。 您可以通过将弱变量复制到一个强变量中来避免这种情况,这是块中的第一件事,因此您知道该弱变量在进入该块之前可能已经消失了,但是在块执行时不会消失。

对块的引用较弱的原因是不保留该块的类。 当实例不再存在时,弱引用将变为nil,因此您需要相应地处理弱引用(在代码中进行此操作)。 如果那不是您想要实现的目标,则需要确保您的实例没有被释放,但这与您的区块无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM