運(yùn)用Memory Graph排查內(nèi)存泄漏

???記住 Memory Graph 的核心作用:

可視化 對象間的引用關(guān)系

快速發(fā)現(xiàn) 循環(huán)引用

無需停止應(yīng)用 實(shí)時(shí)查看

?? 總結(jié):如何“看懂”Memory Graph 找泄漏?

步驟 1:看對象數(shù)量

每個類的數(shù)量(如LeakingViewController (6)、LeakyClass (12)):若數(shù)量遠(yuǎn)大于預(yù)期(比如視圖控制器只應(yīng) 1 個,類實(shí)例只應(yīng) 1 個),則高度可疑。

實(shí)戰(zhàn):定時(shí)器泄漏比較隱蔽,進(jìn)入退出查看控制器數(shù)量是否增長;再進(jìn)而使用Leaks工具排查

?步驟 2:看引用鏈

從可疑對象出發(fā)(如LeakingViewController、LeakyClass),順著箭頭看誰在引用它,誰被它引用。

重點(diǎn)關(guān)注強(qiáng)引用循環(huán)(A→B→C→A)。實(shí)戰(zhàn):閉包強(qiáng)引用和對象相互引用最好排查

?步驟 3:結(jié)合代碼邏輯

回憶代碼中該對象的創(chuàng)建、賦值、引用方式:

定時(shí)器是否用了 block 且捕獲self?

自定義類是否有雙向引用(如sibling、delegate未弱引用)?

閉包是否強(qiáng)引用了外部對象?

?步驟 4:驗(yàn)證釋放時(shí)機(jī)

在代碼中手動觸發(fā)釋放(如 pop 視圖控制器、銷毀單例),然后在 Memory Graph 中查看該對象是否消失。若仍存在,說明泄漏。

???實(shí)戰(zhàn):

引用箭頭:表示對象間的強(qiáng)引用關(guān)系(箭頭方向 = 引用方向,如 A→B 表示 A 強(qiáng)引用 B)。

閉包強(qiáng)引用:這是典型的“閉包捕獲 self 導(dǎo)致內(nèi)存泄漏”模式

? 快速檢查步驟

進(jìn)入退出目標(biāo)頁面,點(diǎn)擊 Memory Graph 圖標(biāo)

1.檢查左側(cè)對象列表

是否有本應(yīng)釋放的對象數(shù)量不為0 (控制器數(shù)量增長)

是否有黃色警告三角

2.檢查右側(cè)引用圖

是否存在強(qiáng)引用循環(huán)

是否存在意外的強(qiáng)引用鏈

Memory Graph圖標(biāo)
兩個User對象互相引用,導(dǎo)致內(nèi)存泄露,實(shí)線代表強(qiáng)引用
使用weak打破循環(huán)后,weak或無引用通常是虛線
Task包含manager,而manager則包括Task,導(dǎo)致循環(huán)引用;若不存在循環(huán)引用,左側(cè)Task與TaskManger對象會消失因?yàn)楸会尫帕?,這是修復(fù)成功的標(biāo)志,說明內(nèi)存泄露問題已經(jīng)解決
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容