IOS 项目中必须避免的几种循环引用的问题

来源:互联网 发布:淘宝头条申请 编辑:程序博客网 时间:2024/06/04 00:48

所谓循环引用就是两个对象互相拥有了对方的强引用,两个对象都没法被释放,从而造成了内存泄漏的问题。​

下面我们就列举几种可能会造成循环引用的情况:

1.NSTimer的使用。​

​timer引用了self:在target上面进行了强引用

而self又引用了timer:timer是self的成员变量

​所以timer和self之间就形成了一个循环引用。在官方文档中中有说到,只有当timer invalidate之后才会释放对target的强引用,所以我们在销毁self之前要将timer invalidate掉。

​2.block的使用

简单的block示例

在项目中我们经常使用block来进行回调,例如AFNetworking就用block来回调网络请求成功与否。​在使用block的时候要避免直接使用self,因为直接使用self会造成循环引用。

常用解决方案 

​因为block在定义之后会默认复制内部使用到的指针,并且是强引用。所以我们在使用block的时候最好在block之前对block内部使用到的指针进行弱引用复制。解决方案如上图,我们创建一个weakSelf来避免这种循环引用的情况。

3.​delegate的使用

delegate的循环引用就是在使用的时候把其声明为了强引用,也就是使用了strong修饰符。代理方会拥有被代理方的引用,被代理方又通过delegate拥有了代理方的引用,这就造成了循环引用。谨记delegate要用weak来修饰!​


新手IOS程序员,欢迎指正^ ^。​

0 0
原创粉丝点击