2018-07-05 weakSelf和strongSelf
2018-07-05 本文已影响37人
肠粉白粥_Hoben
在很多项目中,都能看见一个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
的生命周期。