iOS檢測記憶體洩漏

lishuanglong521發表於2018-12-06

iOS檢測記憶體洩漏

iOS記憶體處理問題一直是一個比較頭疼的問題,有時候面試的時候也會被問到,檢測記憶體洩漏可能大家都會想到Instruments。但是有一個庫,非常方便的能檢測出記憶體洩漏。這個庫就是MLeaksFinder,GitHub上面可以搜到。

MLeaksFinder

簡單介紹一下MLeaksFinder。

官方解釋:

具體的方法是,為基類 NSObject 新增一個方法 -willDealloc 方法,該方法的作用是,先用一個弱指標指向 self,並在一小段時間(3秒)後,通過這個弱指標呼叫 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中斷言。

核心程式碼:

-(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, @“”);
複製程式碼

}

這樣,當我們認為某個物件應該要被釋放了,在釋放前呼叫這個方法,如果3秒後它被釋放成功,weakSelf 就指向 nil,不會呼叫到 -assertNotDealloc 方法,也就不會中斷言,如果它沒被釋放(洩露了),-assertNotDealloc 就會被呼叫中斷言。這樣,當一個 UIViewController 被 pop 或 dismiss 時(我們認為它應該要被釋放了),我們遍歷該 UIViewController 上的所有 view,依次調 -willDealloc,若3秒後沒被釋放,就會中斷言。

安裝:

安裝非常簡單,直接在Podfile中新增pod 'MLeaksFinder',你不需要在任何檔案中引入標頭檔案,執行pod install就行了

案例:

在iOS中,比較常見的記憶體洩露場景就是迴圈引用。作為一個iOS工程師,應該時刻警惕迴圈引用帶來的問題。然而在趕工或者稍有不慎的情況下,還是會出現一些有問題的程式碼。 對於Xcode來說,編譯器會對編寫程式碼中明顯的迴圈引用進行提示,比如對於self.property持有的block中,使用self,Xcode就會顯示警告。

iOS檢測記憶體洩漏

但是有些你不注意的情況下,Xcode有的就不會警告。

在這個控制器被pop後,MLeaksFinder立刻就彈出了彈窗

iOS檢測記憶體洩漏

找到洩漏的地方改成弱引用 __weak typeof(self) weakSelf = self;

至此,MLeaksFinder的簡單使用就介紹完了,真的十分簡單就找到了一些潛在的問題,對於工程幾乎0入侵,強烈推薦使用。

相關文章