iOS檢測內存泄漏

iOS內存處理問題一直是一個比較頭疼的問題,有時候面試的時候也會被問到,檢測內存泄漏可能你們都會想到Instruments。可是有一個庫,很是方便的能檢測出內存泄漏。這個庫就是MLeaksFinder,GitHub上面能夠搜到。面試

MLeaksFinderspa

簡單介紹一下MLeaksFinder。指針

官方解釋:code

具體的方法是,爲基類 NSObject 添加一個方法 -willDealloc 方法,該方法的做用是,先用一個弱指針指向 self,並在一小段時間(3秒)後,經過這個弱指針調用 -assertNotDealloc,而 -assertNotDealloc 主要做用是直接中斷言。cdn

核心代碼:對象

-(BOOL)willDealloc {blog

__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 {get

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就會顯示警告。

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

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

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

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

相關文章
相關標籤/搜索