iOS-滥用__weak-__typeof(self)-weakSelf-=-self;

48 阅读1分钟

不知道什么时候开始,写代码只要有block就在block里面写如下代码:

__weak __typeof(self) weakSelf = self;
[self dismissViewControllerAnimated:YES completion:^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    [strongSelf cancelSafeDeviceBinding];
}];

首先解释一下,为什么外面使用weakSelf?

如果self持有block,block里也持有self,这样就会造成循环引用,所以我们使用weakSelf。

为什么block里面又使用strongSelf?

访问self的时候我们使用一个临时的强指针来访问self,这样在整个block执行期间,可以保证self对象不会被销毁,同时,block调用完后,临时的强指针被销毁,一切又回归原来的样子。这样既能保证整个block执行期间,self对象不会被销毁,又能保证不会产生循环引用。

但是上面的代码,虽然block里面引用了self,但是self并没有引用block,所以上面的代码没有循环引用,没必要使用weakSelf,正确写法如下:

[self dismissViewControllerAnimated:YES completion:^{
    [self cancelSafeDeviceBinding];
}];

关于block的循环引用,具体可参考:www.jianshu.com/p/5be4b1ca5…