从一开始——我的iOS学习之路

2018-07-05 weakSelf和strongSelf

2018-07-05  本文已影响37人  肠粉白粥_Hoben

在很多项目中,都能看见一个block前后有weakSelfstrongSelf的身影,究竟为什么要这样写呢?参考以下博客,弄明白了:

  1. 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
  2. 透彻理解block中weakSelf和strongSelf

1.Block

OC里面的Block是个很实用的语法,如果和GCD一起使用,就可以很方便地实现并发、异步等任务。但是如果使用不当,就会产生循环引用的问题。原因:Block 持有 self,同时self也持有了Block

2.weakSelf

对此的解决方案是:在传入Block之前,将self转换成weak automatic的变量,这样Block就不会出现对self的强引用。如果在Block执行完成之前,self被释放的话,则weakSelf也会变成nil

__weak __typeof__(self) weakSelf = self;
dispatch_async(queue, ^{
    [weakSelf doSomething];
});

这样,Block就不会对self持续引用,造成循环引用的bug了。

3.strongSelf

但是,如果weakSelf要在Block持续使用的话,如果这时候self被突然释放了,weakSelf就会被释放,导致weakSelf的工作未完成,比如:

__weak __typeof__(self) weakSelf = self;
dispatch_async(queue, ^{
    //执行到这里不会被释放
    [weakSelf doSomething];

    //执行到这里有可能会被释放
    [weakSelf doOtherThing];
});

这时候strongSelf就要登场了,它可以确保在Block内,strongSelf不会被释放,同时可以保证不会造成循环引用的情况。

__weak __typeof__(self) weakSelf = self;
dispatch_async(queue, ^{
    __strong __typeof__(self) strongSelf = weakSelf;    

    //执行到这里不会被释放
    [strongSelf doSomething];
    [strongSelf doOtherThing];
});

使用strongSelf之后,指针连带关系self的引用计数还会增加。但是strongSelf是在Block里面,生命周期也只在当前Block的作用域。

所以,当这个Block结束,strongSelf随之也就被释放了。同时也不会影响Block外部的self的生命周期。

上一篇 下一篇

猜你喜欢

热点阅读