iOS-内存泄露检测工具(MLeaksFinder)

来源:互联网 发布:淘宝页面装修教程 编辑:程序博客网 时间:2024/04/30 06:36

MLeaksFinder

MLeaksFinder helps you find memory leaks in your iOS apps at develop time. It can automatically find leaks in UIView and UIViewController objects, You can also extend it to find leaks in other kinds of objects.

译:
在你的iOS应用程序在开发阶段,MLeaksFinder可以帮你找到内存泄漏问题。它可以在UIView和UIViewController对象中自动发现泄漏,当内存泄漏时,会自动断点和打印出View-ViewController堆栈中的泄露对象。你也可以使用它检测其他类型对象的内存泄漏问题。

GitHub下载地址
MLeaksFinder GitHub下载地址

安装方法
一、手动安装
1、Add MLeaksFinder to your Target Dependencies and Link Binary With Libraries
在github上下载MLeaksFinder开源库,将其中的MLeaksFinder文件夹拖入到你的工程中
2、Click your app’s target, then “Build Settings”, search for “Other Linker Flags”, add ‘-ObjC’
选择你的app的target —> Build Settings —> search for “Other Linker Flags” —> add ‘-ObjC’
这样就可以了,不需要其他操作了,很简单吧

二、CocoaPods 安装

pod 'MLeaksFinder'

使用

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Possibly Memory Leak.In case that MyTableViewCell should not be dealloced, override -willDealloc in MyTableViewCell by returning NO.View-ViewController stack: (    MyTableViewController,    UITableView,    UITableViewWrapperView,    MyTableViewCell)'当发生内存泄露时,会自动打印出哪些控制器和视图没有被释放,会提醒你是否需要释放,如果不需要释放(比如单例),需要调用willDealloc方法,返回NO

内存泄露原因总结
ARC工程是可以重写dealloc方法,而且当对象被释放时会被调用,但不需要手动调用父类的dealloc,当调用[super dealloc]方法时会报错,因为系统会自动帮我们调用父类的dealloc方法,不需要重写;
但有些时候会发现控制器出栈的时候不会调用dealloc方法,归根结底,是因为当前控制器被某些对象 强引用 了,控制器的引用计数不为0,系统无法自动释放这部分内存,导致控制器也不能主动释放。

控制器被强引用的原因:

1、block块使用不当,导致循环引用。因为block会对方法中的变量自动retain一次。
引用外部变量需要使用 __block
调用self 需要 __weak

2、NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁
因为 target:self ,也就是引用了当前viewController,导致控制器的引用计数加1,如果没有将这个NSTimer 销毁,它将一直保留该viewController,无法释放,也就不会调用dealloc方法。所以,需要在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
销毁方法:

[timer invalidate]; // 销毁timertimer = nil; //nil

3.viewController中的代理不是weak属性
例如代理要使用弱引用

@property (nonatomic, weak) id delegate;

因为代理是被控制器强引用的,所以自己需要使用weak弱引用

0 0
原创粉丝点击