内存泄露和循环引用问题

内存泄露和循环引用问题

开发项目时你怎么检查内存泄漏

  • 静态分析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)

你可能感兴趣的:(内存泄露和循环引用问题)