从苹果的开发者文档里可以看到,内存分类
1.Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).
2.Abandoned memory: Memory still referenced by your application that has no useful purpose.
3.Cached memory: Memory still referenced by your application that might be used again for better performance.
其中 Leaked memory
和 Abandoned memory
都属于应该释放而没释放的内存,都是内存泄露
在 ARC 时代更常见的内存泄露是循环引用导致的Abandoned memory
,Leaks 工具查不出这类内存泄露
现在利用Instrument的Allocations进行简单的方法检测内存泄露
1.打开Instrument的Allocations,选择对应的模拟器(比如6s),对应的项目.
2.录制前基本配置,如图
3.对相应的项目,找到对应控制器,push->pop,连续四五次(需同时配合4步骤一起做),如下图
4.每次push控制器后,点击generations,生成快照,如第一个图
5.查看每次生成的快照对应的内存,如下图,发现四个红旗flag,第一个为3.19MB,第二个为6.10MB,第三个为8.2MB,第四个为10.6MB,也就是说每次push后,内存都会增加了2~3MB,(也可以看输出台的Growth列表信息得知)由此可以判断出这个控制器发生了内存泄露.
6.检查这个控制器的代码,看是否有循环引用.示例程序文件里是block
里直接用了self
,如下
tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[self loadNewPositions];
}];
修改代码为如下
@weakify(self);
tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
@strongify(self);
[self loadNewPositions];
}];
此方法有些繁琐,也有MLeaksFinder
第三方库进行内存检测,有兴趣的可以看原文进行测试.
原文链接