instrument检查内存不断增大原因

时间:2024-04-05 09:29:07

利用Xcode自带的instrument检查内存占用情况,并定位内存不断增大的原因

首先点击如下图所示选项:

instrument检查内存不断增大原因


点击profile。出现如下界面,选Allocations instrument ,如下图所示。

instrument检查内存不断增大原因

选择了之后,就会出现instrument的面板,然后选择CallTree(如下图),具体每个地方做什么用我就不解释了,《instrument使用指南》已经写的很清楚了。

instrument检查内存不断增大原因

并在底部勾选hide System Libraries隐藏系统库函数,如下图

instrument检查内存不断增大原因

然后要做的就是使内存不停的消耗,因为我这里把代码写在表的代理中,只要不停的滚动表就行了。

不停地一边滚动表格一边观察instrument面板如下图所示位置的变化:

instrument检查内存不断增大原因

上图中标红的地方表示的是当前主线程中占用内存比例最大的地方9.24M,比例为19.3%;双击右侧箭头所指的地方,跳转到Xcode代码块,如下图红色区域就是导致内存不断增大的代码块

instrument检查内存不断增大原因


原因:

如下图,最后发现在是由于UICollectionView每秒都在不断刷新UI,每秒钟都会调用一次上图的代理函数,在复用尾部视图的代理函数里面,footerView是从复用列表获取的,然后在footerView上面添加一个按钮channelCheckBtn,由于没有判断footerView上面是否已存在此按钮,如果已存在,就不用每次都创建一个新的channelCheckBtn并添加到footerView上面,这样就造成了footerView上面不断添加新的channelCheckBtn,内存不断增大;


解决办法:

在footerView上添加channelCheckBtn之前先判断footerView上面是否已添加过channelCheckBtn,判断方法可以通过一个tag值,取出footerView的子视图,如果通过tag值取出的view不为空,就表示footerView上面已经存在了channelCheckBtn,如果为空,就重新创建一个channelCheckBtn,设置好tag值之后添加到footerView上面,达到复用效果;

修改后的代码如下

instrument检查内存不断增大原因