自从项目中导入MyLeaksFinder以来,项目中就经常会报Memory Leak的提示,经过几次调试终于总结到这种情况可能出现的几种原因:
1,VC中使用了NSTimer计时器,使用计时器当VC进行push ——pop之后,如果NSTimer对象没有进行销毁,就会造成内存泄漏,也就是引用了当前VC,导致控制器的引用计数加1,如果没有将这个NSTimer 销毁,它将一直保留该VC,无法释放,也就不会调用dealloc方法。所以,需要在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
销毁方法:[timer invalidate]; // 销毁timer
timer = nil; // 置nil
或者在GCD中的销毁方法:
dispatch_source_cancel(_timer);
2,Block代码块中使用了强引用self,容易造成循环引用,对象长时间不能释放而引起的。
具体可以:
#define WS(weakSelf) __weak __typeof(self)weakSelf = self;
使用弱引用weakSelf来代替self,
或者项目在回调代码块中调用内部成员变量及属性时的self.name或者_name都会引起循环引用,具体方法同上。
3,就是可能在项目VC中采用的代理方法属性的代理不是weak属性具体的方法如下:
:@property (nonatomic, weak) id delegate;
剩下具体还可能造成的原因还在进一步探索中,如果有新的可能造成的原因也欢迎大家在评论区补充,祝大家前程似锦!