欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

ios在UIViewController中不走dealloc或者导致Memory Leak的原因

程序员文章站 2022-05-09 20:53:28
自从项目中导入MyLeaksFinder以来,项目中就经常会报Memory Leak的提示,经过几次调试终于总结到这种情况可能出现的几种原因: 1,VC中使用了NSTimer...

自从项目中导入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;

剩下具体还可能造成的原因还在进一步探索中,如果有新的可能造成的原因也欢迎大家在评论区补充