首先交代一下背景:
在 ARC 時(shí)代較常見的內(nèi)存泄露是循環(huán)引用導(dǎo)致的,開發(fā)中也較容易被忽略.而蘋果的 Instrument 操作起來既不簡單又不粗暴,而且有些工具還查不出來這類問題.
那么這篇文章適合你嗎?
- 你需要一個簡單粗暴的檢測工具嗎?
- 你是否對當(dāng)前項(xiàng)目內(nèi)存問題做過整體的跟蹤監(jiān)測?
- 你想要一個即時(shí),精準(zhǔn),讓你無拖延的解決問題的輔助工具嗎?
如果你都不需要,其實(shí)你也可以了解一下,因?yàn)樗⒉荒艿⒄`你幾分鐘時(shí)間,下面我們來看看如何
使用及效果:
第一步: 通過 pod 直接安裝或下載拖入
pod 'MLeaksFinder'
第二步: 給你的基類或任何一個類添加上這樣一部分內(nèi)容
- (BOOL)willDealloc
{
__weak id weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[weakSelf assertNotDealloc];
});
return YES;
}
- (void)assertNotDealloc
{
NSAssert(NO, @“”);
}
第三步: 跑起來試試吧! 如果哪個類側(cè)漏了,那么將會進(jìn)入斷言直接停止運(yùn)行.
中斷言時(shí),我們通過控制臺如下提示可以看出 SearchResultBaseVC 這個類沒有釋放。

debug.png
那么如果我們找到了那個類,那么應(yīng)該怎么確定問題呢?
- (BOOL)willDealloc
{
if(![super willDealloc]) {
return NO;
}
// 可以這樣 我們來看看是哪個對象沒有被釋放
MLCheck(object);
return YES;
}
從 MLeaksFinder 的使用方法可以看出,MLeaksFinder 具備以下優(yōu)點(diǎn):
1.使用簡單,不侵入業(yè)務(wù)邏輯代碼,不用打開 Instrument
2.不需要額外的操作,你只需開發(fā)你的業(yè)務(wù)邏輯,在你運(yùn)行調(diào)試時(shí)就能幫你檢測
3.內(nèi)存泄露發(fā)現(xiàn)及時(shí),更改完代碼后一運(yùn)行即能發(fā)現(xiàn)(這點(diǎn)很重要,你馬上就能意識到哪里寫錯了)
4.精準(zhǔn),能準(zhǔn)確地告訴你哪個對象沒被釋放
當(dāng)然,它也有一些缺點(diǎn),比如一些不能被釋放的(單例,一級界面,某些系統(tǒng)的私有 View,手勢返回機(jī)制問題等),我們需要添加白名單.
就這么簡單了.
這里非常感謝 WeRead團(tuán)隊(duì)博客 提供的內(nèi)容,如您欲詳細(xì)了解請移步 中文介紹