美文网首页
iOS block循环引用的一点领悟

iOS block循环引用的一点领悟

作者: 走近科学探索发现 | 来源:发表于2019-05-27 14:23 被阅读0次

这几天看了block,但是对于其中的一些问题还是非常的疑惑。

我们知道,之所以造成bolck循环引用是因为,self持有了block,block又强引用持有了self 。

但是为什么在block内部再次强引用就不会造成循环引用呢?

代码如下:


@interface zswViewController ()

@property(nonatomic,copy) void(^he)(void);

@property(nonatomic,assign)NSInteger num;

@end

@implementationzswViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blueColor];

    __weak typeof(self) weakSelf =self;

    self.he= ^{

        __strong typeof(weakSelf) strongSelf = weakSelf;

        NSLog(@"%ld", (long)strongSelf.num) ;

    };



   self.he();



}

这是因为,直接使用外部变量的block会默认根据外部是否是强引用,而决定内部是否强引用。

所以如果直接引用self,block就会强引用self。而此时block有被self持有。所以block的生命周期(不考虑其他类引用了blcok)必须要要等到self释放时 block引用计数-1,才能释放。

但是如果先weak以后,再在block里使用strong。block先弱持有self,然后block的内部变量持有self。而内部变量的生命周期在执行完block {} 括号后就要释放,不需要等到block释放。所以block执行完毕后self只有blcok的弱持有,所以不会造成循环引用。

相关文章

网友评论

      本文标题:iOS block循环引用的一点领悟

      本文链接:https://www.haomeiwen.com/subject/uakhtctx.html