内存泄露和循环引用问题
开发项目时你怎么检查内存泄漏
- 静态分析analyze
- instruments里有一个leak工具可以动态分析
- 如果block中多次使用weakSelf的话,可以在block中先使用strongSelf,防止block执行时weakself被自动释放
- 对于非ARC,将weak改用为block即可
常见的出现循环引用的场景有哪些
- 定时器(NSTimer):NSTimer经常会被作为某个类的成员变量,而NSTimer在初始化时又要指定self为target,容易造成循环引用。另外,若timer一直处于validate的状态,则其引用计数将始终大于0,因此在NSTimer使用完毕之后,应该先调用invalidate方法,而且在定义NSTimer属性的时候要使用weak修饰符。
- block:block在copy时会对block内部用到的对象进行强引用(ARC中访问到外部变量会把变量copy到堆中)或者引用计数+1(非ARC)。一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身。解决办法:
__weak __typeof__ (self) wself = self;
- 代理:规避代理循环引用的方法:声明delegate属性的时候用assign(MRC)或weak(ARC)