__weak __typeof(self)weakSelf = self; //1
[self.context performBlock:^{
[weakSelf doSomething]; //2
__strong __typeof(weakSelf)strongSelf = weakSelf; //3
[strongSelf doSomething];
}];
关于block什么时候用这个weakSelf和strongSelf.
如果直接在blog中调用对象会被block强引用,这个都是常识就不说了.
1.使用__weak __typeof是在编译的时候,另外创建一个weak对象来操作self.
2.因为weakSelf和self是两个内容,doSomething有可能就直接对self自身引用计数减到0了.
所以在[weakSelf doSomething]的时候,你很难控制这里self是否就会被释放了.weakSelf只能看着.
3.__strong __typeof在编译的时候,实际是对weakSelf的强引用.
指针连带关系self的引用计数还会增加.但是你这个是在block里面,生命周期也只在当前block的作用域.
所以,当这个block结束, strongSelf随之也就被释放了.同时也不会影响block外部的self的生命周期.
PS : 这里的weakSelf 和 strongSelf 配合使用是防止block中使用对象,对象出现空导致接下来的代码出现问题的情况.
在研究AFN或者其他比较火的第三方框架也会常见到这种用法
weakSelf和strongSelf.png参考博文:
透彻理解block中weakSelf和strongSelf
到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
网友评论