【填坑】关于在 block   遇到的坑

最近在做项目的时候遇到 block 中对象循环引用的问题。 发现自己对 block 还不是特别深入, 有时间对 block 进行下总结回顾。

当时代码是这样的:

-(void)addProgressView
{
    AVPlayerItem *playerItem = self.player.currentItem;
    
    [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){
        float current = CMTimeGetSeconds(time);
        float total = CMTimeGetSeconds([playerItem duration]);
        self.progressSlider.maximumValue = total;
        self.progressSlider.value = current;
    }];
}

出现警告是:

capturing 'self' stringly in this block is likely to lead to a retain cycle

block 循环引用

block 中会对引用的对象进行retain (引用计数 + 1), 该操作对象又将retain 该 block,从而导致相互retain引起循环引用,它们将永远不会被释放。并且造成内存泄漏。

解决方法:

MRC : 在 block 外,把 self 转换一下加上 __block 字段之后就不会被 retain 了;MRC 中不能使用__ weak

ARC : 在 block 外,把 self 转换一下加上 __weak 字段之后就不会被 retain 了; ARC 中 __block使用无效

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容