iOS 闭包中的[weak self]在什么情况下需要使用,什么情况下可以不加?

关注者
146
被浏览
31,875

9 个回答

如果block没有直接或者间接被self存储,就不会产生循环引用。

循环引用只要不依赖release打断,也应该不会产生内存泄漏问题。

自己设计的模块都可以在合适时机进行打断。难就难在对系统类加扩展方法导致的循环引用。如果找得到合适的时机打断,也是没问题的。

另外有个简单的方法可以绕过这个问题,如果self引用了一个block,block又需要调用self,可以把self通过参数回传给block,这样就不会产生循环引用了。block回传的self可以声明成id类型,这样使用的时候可以在入参声明具体self类型,避免显式类型转换,方便开发。

typedef void (^Block) (id selfRef);

Block block = ^(XXX *selfRef){

};

我跟大家分享想唐巧在YTKNetWorking里怎么处理这件事的

YTKNetWorking的block是不需要weak引用的,

项目地址在这:

yuantiku/YTKNetwork · GitHub

唐巧在文档中也说明了,可以在block里直接用self。

原理其实也很简单,在网络请求结束的时候,调用了这个方法把block置空,就打破了循环引用。

话说- -之前去面试,很多人都不知道这个技巧,自己封装的时候,这么做,就能少写好多weakself&strongself...

最后还是要感谢巧神开源了这么好的项目~~