Strong-Weak Dance

对 Strong-Weak Dance 的思考

在使用Block时,除了使用__weak修饰符避免循环引用外,还有一点经常容易忘记。苹果把它称为:“Strong-Weak Dance”。

问题来源

这是一种 强引用 –> 弱引用 –> 强引用 的变换过程。在弄明白为什么要如此大费周章之前,我们首先来看看一般的写法会有什么问题。

__weakMyViewController *wself=self;

self.completionHandler=^(NSIntegerresult){

[wself.propertyremoveObserver:wselfforKeyPath:@"pathName"];

};

这种写法可以避免循环引用,但是我们要考虑这样的问题:

假设block被放在子线程中执行,而且执行过程中self在主线程被释放了。由于wself是一个弱引用,因此会自动变为nil。而在 KVO 中,这会导致崩溃。

Strong-Weak Dance

解决以上问题的方法很简单,新增一行代码即可:

__weakMyViewController *wself=self;

self.completionHandler=^(NSIntegerresult){

__strong__typeof(wself)sself=wself;// 强引用一次

[sself.propertyremoveObserver:sselfforKeyPath:@"pathName"];

};

这样一来,self所指向对象的引用计数变成 2,即使主线程中的self因为超出作用于而释放,对象的引用计数依然为 1,避免了对象的销毁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容