常看IosiOS提升开发效率

iOS检测内存泄露Allocations简单用法

2016-07-17  本文已影响2222人  船长_

从苹果的开发者文档里可以看到,内存分类

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 memoryAbandoned memory 都属于应该释放而没释放的内存,都是内存泄露
在 ARC 时代更常见的内存泄露是循环引用导致的Abandoned memory,Leaks 工具查不出这类内存泄露

现在利用Instrument的Allocations进行简单的方法检测内存泄露

1.打开Instrument的Allocations,选择对应的模拟器(比如6s),对应的项目.
2.录制前基本配置,如图

Snip20160717_1.png

3.对相应的项目,找到对应控制器,push->pop,连续四五次(需同时配合4步骤一起做),如下图

demo3.gif

4.每次push控制器后,点击generations,生成快照,如第一个图
5.查看每次生成的快照对应的内存,如下图,发现四个红旗flag,第一个为3.19MB,第二个为6.10MB,第三个为8.2MB,第四个为10.6MB,也就是说每次push后,内存都会增加了2~3MB,(也可以看输出台的Growth列表信息得知)由此可以判断出这个控制器发生了内存泄露.

demo2.gif

6.检查这个控制器的代码,看是否有循环引用.示例程序文件里是block里直接用了self,如下

tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [self loadNewPositions];
    }];

修改代码为如下

@weakify(self);
tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        @strongify(self);
        [self loadNewPositions];
    }];

此方法有些繁琐,也有MLeaksFinder第三方库进行内存检测,有兴趣的可以看原文进行测试.
原文链接

上一篇下一篇

猜你喜欢

热点阅读