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










网友评论