美文网首页常看IosiOS提升开发效率
iOS检测内存泄露Allocations简单用法

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

作者: 船长_ | 来源:发表于2016-07-17 15:34 被阅读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第三方库进行内存检测,有兴趣的可以看原文进行测试.
原文链接

相关文章

网友评论

  • XIAODAO:“在 ARC 时代更常见的内存泄露是循环引用导致的Abandoned memory,Leaks 工具查不出这类内存泄露” ----- Leaks可以查出循环引用引起的内存泄露,Xcode 7.3 版本已验证
  • 镜中之宇:这个block没有循环引用,self根本没持有这个block
    船长_:@镜中之宇 分情况吧,我这里有验证
  • AT19:怎么通过红旗flag找到相应的代码??
    Piccc:@山治ping 哈哈哈不是延迟高,我是路人回复你的
    AT19:@Piccc 延迟有点高啊,不过还是谢谢
    Piccc:mark generation啊
  • 奔跑的鸿:请问最后那个@strongify(self)有什么用,这种情况不写它是不是也没关系,写了它能确保什么呢?
    船长_:@奔跑的鸿 保证代码执行到block 中,self 不被释放,当block执行完后,会自动释放strongself
    奔跑的鸿:@船长_ 可否问少部分情况呢!
    船长_:@奔跑的鸿 大部分情况不写也没关系

本文标题:iOS检测内存泄露Allocations简单用法

本文链接:https://www.haomeiwen.com/subject/njbujttx.html