在 iOS 開發(fā)中躁锁,最常用的就是 UIViewController
了减俏,也是 MVC 的重要組成部分。但是視圖控制器也是經(jīng)常發(fā)生內(nèi)存泄漏的組件之一贸街,因?yàn)樗慕Y(jié)構(gòu)往往很復(fù)雜,經(jīng)常要持有各種各樣的對象狸相,又被多個(gè)對象同時(shí)持有薛匪。稍有不慎就會導(dǎo)致循環(huán)引用,最終導(dǎo)致內(nèi)存泄漏脓鹃。
今天我們就來講講幾種檢測控制器內(nèi)存泄漏的方法逸尖。
方法一
直接在控制器銷毀的時(shí)機(jī)打印一條日志:
deinit {
print("\(self) 正常銷毀~")
}
這是最簡單的一種方式,如果這個(gè)控制器存在內(nèi)存泄漏瘸右, deinit 方法將不會被調(diào)用娇跟,進(jìn)而不會打印任何內(nèi)容。
你可以在頁面退出的時(shí)候觀察控制臺有沒有打印這條 log 來判斷是否正常銷毀太颤。
方法二
使用斷點(diǎn)在銷毀時(shí)機(jī)自動(dòng)播放聲音苞俘,與上邊的方法類似,但是這個(gè)方法利用的是全局?jǐn)帱c(diǎn)栋齿。
點(diǎn)擊導(dǎo)航欄上的的斷點(diǎn)按鈕(快捷鍵 command + 8
)苗胀,點(diǎn)擊左下角的加號,然后選擇 Symbolic Breakpoint...
接下來填寫斷點(diǎn)的配置:
Name : 斷點(diǎn)的名稱瓦堵,可以不填
將 Symbol
設(shè)置為值 -[UIViewController dealloc]
,表明觸發(fā)時(shí)機(jī)是 UIViewController
在調(diào)用 dealloc
方法的時(shí)候歌亲。
Module
執(zhí)行的模塊名菇用,可以不填
然后點(diǎn)擊 Add Action
按鈕,這里可以選擇一個(gè)觸發(fā)斷點(diǎn)后的操作陷揪,比如我們選擇 Sound惋鸥,意思是當(dāng)觸發(fā)斷點(diǎn)時(shí)播放一個(gè)聲音,后邊的選項(xiàng)可以選擇不同的聲音
最后需要勾選 Options悍缠,Automatically continue after evaluating actions卦绣,意思是當(dāng)觸發(fā)斷點(diǎn)時(shí)是停在這里還是繼續(xù)執(zhí)行代碼,我們這里勾選這個(gè)選項(xiàng)飞蚓,觸發(fā)之后繼續(xù)執(zhí)行代碼滤港。
這時(shí)整個(gè)斷點(diǎn)就設(shè)置好了,當(dāng)有控制器銷毀時(shí)(調(diào)用了 dealloc)趴拧,電腦就會發(fā)出一個(gè)聲音溅漾,這樣我們就可以在頁面關(guān)閉時(shí)注意有沒有這個(gè)聲音播放來判斷是否有內(nèi)存泄漏山叮。
方法三
利用第三方工具,有一些第三方工具利用運(yùn)行時(shí)對 UIViewController 生命周期方法進(jìn)行監(jiān)控等方式來檢測是否存在內(nèi)存泄漏添履。
比如之前騰訊比較著名的 MLeaksFinder屁倔,但是這個(gè)庫已經(jīng)很久不維護(hù)了,我找到了另外一個(gè)開源庫叫做 AMLeaksFinder[1]暮胧,它也是利用了類似的原理锐借。
只需要我們利用 CocoaPods 導(dǎo)入這個(gè)庫
pod 'AMLeaksFinder', '2.2.4', :configurations => ['Debug']
效果如下: