从搜集的数据中分析内存中存在的问题
- 搜集数据
这里因为篇幅问题暂时只介绍一种打开Allocatons的方法,首先在真机上运行app。
在DebugNavigation
上面选在Memory
,可以看到大概的内存情况,再点击Profile in Instruments
进入Allocations页面。

先看Detail pane
这里是收集到得数据,下面我们要从这里分析出哪里出问题了。
先介绍几个概念。
Persistent
:该对象存在于内存中的个数
Transient
:存在过已经被回收的对象的个数
Persistent Byte
:该类对象在内存中占得总内存
Growth
:增加的内存
接下来看看这些数据,选择Statistics统计
,这些数据的排列是按照所占内存的大小,从高到低排列下来的。

第一种方法
现在介绍的这个找出问题的方法,建立在你大概可以感觉到哪个地方出错了。不然你就得,看这里大量的数据,从中找出感觉不对劲的。下面的一种方法会介绍从宏观的角度去找问题。
看这个类,目前在内存中只有1个(它是一个cell,该类型的cell,在数据源里面只有一个),然后我会不停的在这个页面和其他页面之间切换。

切换之后

//这里变成了10,正确的应该只有一个的??
选中灰色箭头

到这里

选中其中之一,在详情扩展区域(Extended Deatil Area)选择,Extended,

到这里,

可见这里的cell没有重用,每次都会创建一个
然后把它换成这样,就ok了

第二种方法
第一步,观察内存的graph,看看有没有哪里是异常的。
下面是我三进三出,一个页面所出现的内存曲线

可以看到内存在递增.。然后我将会打点,对就是打点,在进页面和出页面的时候分别打点,也就是6个点。来观察不同时间内,是哪些数据的内存异常增加(Unbounded memory growth)
在详情面板,选择
Generation
(1),然后再Extended Detail Area
(2)区域选择DisPlay Settings
,每次要打点时按MarkGeneration
(3),在图形区域就会出现一个红色的小旗子(4),6个点分别命名A、B、C、D、E、F(5)

然后分析数据
看Growth,从0-12.16M
、17.96k-2.24M
、8.09k-2.48M
,可见每次进入目标页面,内存就会增加几兆,第一次更多,为什么,是什么占用了这么多内存。
点看B,请看这里内存占用最多的是和图形和动画相关的,SVProgressHUD,CoreUI Image,CoreAnimation

第一次增加的特别多什么呢,再看D

在A里面排列前几的都没了,推测可能是因为有缓存
占有最多的是,每次进入页面的刷新组件的头部,头部是有动画效果的,所以比较耗内存。
如何运用第二种方法
先在各个页面划一划,看看总体的内存情况,如果发现有异常的内存曲线,就多次打点,取数据分析。
Tips:多次进入同一个页面内存会缓慢上升,不要急,这是缓存,只要按home键退到后台就降下来了
网友评论