從蘋果的開(kāi)發(fā)者文檔里可以看到,內(nèi)存分類
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
都屬于應(yīng)該釋放而沒(méi)釋放的內(nèi)存僚焦,都是內(nèi)存泄露
在 ARC 時(shí)代更常見(jiàn)的內(nèi)存泄露是循環(huán)引用導(dǎo)致的Abandoned memory
,Leaks 工具查不出這類內(nèi)存泄露
現(xiàn)在利用Instrument的Allocations進(jìn)行簡(jiǎn)單的方法檢測(cè)內(nèi)存泄露
1.打開(kāi)Instrument的Allocations,選擇對(duì)應(yīng)的模擬器(比如6s),對(duì)應(yīng)的項(xiàng)目.
2.錄制前基本配置,如圖
3.對(duì)相應(yīng)的項(xiàng)目,找到對(duì)應(yīng)控制器,push->pop,連續(xù)四五次(需同時(shí)配合4步驟一起做),如下圖
4.每次push控制器后,點(diǎn)擊generations,生成快照,如第一個(gè)圖
5.查看每次生成的快照對(duì)應(yīng)的內(nèi)存,如下圖,發(fā)現(xiàn)四個(gè)紅旗flag,第一個(gè)為3.19MB,第二個(gè)為6.10MB,第三個(gè)為8.2MB,第四個(gè)為10.6MB,也就是說(shuō)每次push后,內(nèi)存都會(huì)增加了2~3MB,(也可以看輸出臺(tái)的Growth列表信息得知)由此可以判斷出這個(gè)控制器發(fā)生了內(nèi)存泄露.
6.檢查這個(gè)控制器的代碼,看是否有循環(huán)引用.示例程序文件里是block
里直接用了self
,如下
tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[self loadNewPositions];
}];
修改代碼為如下
@weakify(self);
tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
@strongify(self);
[self loadNewPositions];
}];
此方法有些繁瑣,也有MLeaksFinder
第三方庫(kù)進(jìn)行內(nèi)存檢測(cè),有興趣的可以看原文進(jìn)行測(cè)試.
原文鏈接