所谓循环引用就是两个对象互相拥有了对方的强引用,两个对象都没法被释放,从而造成了内存泄漏的问题。
下面我们就列举几种可能会造成循环引用的情况:
1.NSTimer的使用。
timer引用了self:在target上面进行了强引用
而self又引用了timer:timer是self的成员变量
所以timer和self之间就形成了一个循环引用。在官方文档中中有说到,只有当timer invalidate之后才会释放对target的强引用,所以我们在销毁self之前要将timer invalidate掉。
2.block的使用
在项目中我们经常使用block来进行回调,例如AFNetworking就用block来回调网络请求成功与否。在使用block的时候要避免直接使用self,因为直接使用self会造成循环引用。
因为block在定义之后会默认复制内部使用到的指针,并且是强引用。所以我们在使用block的时候最好在block之前对block内部使用到的指针进行弱引用复制。解决方案如上图,我们创建一个weakSelf来避免这种循环引用的情况。
3.delegate的使用
delegate的循环引用就是在使用的时候把其声明为了强引用,也就是使用了strong修饰符。代理方会拥有被代理方的引用,被代理方又通过delegate拥有了代理方的引用,这就造成了循环引用。谨记delegate要用weak来修饰!
新手IOS程序员,欢迎指正^ ^。