2018-07-05 weakSelf和strongSelf

作者: 肠粉白粥_Hoben | 来源:发表于2018-07-05 15:29 被阅读37次

在很多项目中,都能看见一个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的生命周期。

相关文章

  • RN 调 js 核心代码

    ^{RCTJSCExecutor *strongSelf = weakSelf;if (!strongSelf |...

  • 宏定义

    1.weakSelf和strongSelf

  • 2018-07-05 weakSelf和strongSelf

    在很多项目中,都能看见一个block前后有weakSelf和strongSelf的身影,究竟为什么要这样写呢?参考...

  • iOS宏定义

    1 weakself和strongself #ifndef weakify #if DEBUG #ifhas_fe...

  • weakSelf和strongSelf

    https://www.jianshu.com/p/51bb714051ea 我们发现这样确实解决了问题,但是可能...

  • weakSelf和strongSelf

    在block中常常会用到weakSelf和strong来处理block的产生循环引用的问题。 使用情况 直接在 b...

  • StrongSelf和WeakSelf

    我们在研发的过程中,为了避免循环引用常常会用weak若饮用来打破循环链 但是有时候,在异步多任务的时候,为了避免w...

  • 不一样的书写样式

    **********************1.block中weakSelf 与 strongSelf******...

  • StrongSelf

    weakSelf : 防止循环引用 strongSelf: 防止释放 需要 强引用weakSelf,主要是处理一...

  • weakSelf/strongSelf

    1.Retain Circle的由来 当A对象里面强引用了B对象,B对象又强引用了A对象,这样两者的retainC...

网友评论

    本文标题:2018-07-05 weakSelf和strongSelf

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