ios在UIViewController中不走dealloc或者导致Memory Leak的原因
2018-03-16 10:32
363 查看
自从项目中导入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;
剩下具体还可能造成的原因还在进一步探索中,如果有新的可能造成的原因也欢迎大家在评论区补充,祝大家前程似锦!
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;
剩下具体还可能造成的原因还在进一步探索中,如果有新的可能造成的原因也欢迎大家在评论区补充,祝大家前程似锦!
相关文章推荐
- iOS开发 PushViewController卡死或者popViewController时候卡死的可能原因之一
- iOS开发--- WKWebView导致Controller不调用dealloc
- 记录iOS viewController无法dealloc的原因分析和解决过程
- IOS-57-导致内存未释放的常见原因(现象:dealloc不执行等)
- IOS 如何从ViewController获取一个UIView上的某种或者某个控件
- iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewController
- [转]Building a iOS Unity + UIView / UIViewController / Interface Builder App
- ThinkPHP的controller里变量输出位置不正确导致变量输出无效,原因不明??
- iOS 3D Touch (UIApplicationShortcutItem、UIViewControllerPreviewing、UIPreviewAction)
- ios UIViewController
- Mysql优化,导致查询不走索引的原因总结
- 导致ios 接移动支付唤不起内嵌wap的原因
- iOS 控制器POP后dealloc方法不走,通知监听无法移除的问题
- iOS pop 了为什么不走dealloc方法
- iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon[转]
- iOS viewcontroller中的dealloc方法不调用
- ios UIViewController页面跳转
- iOS UIViewController 应用要点
- ios UIViewController各个方法的加载顺序
- iOS中UIViewController生命周期和响应者链