1. 程式人生 > >iOS-記憶體洩露檢測工具(MLeaksFinder)

iOS-記憶體洩露檢測工具(MLeaksFinder)

MLeaksFinder

MLeaksFinder helps you find memory leaks in your iOS apps at develop time.
 It can automatically find leaks in UIView and UIViewController objects,
 You can also extend it to find leaks in other kinds of objects.

譯:
在你的iOS應用程式在開發階段,MLeaksFinder可以幫你找到記憶體洩漏問題。它可以在UIView和UIViewController物件中自動發現洩漏,當記憶體洩漏時,會自動斷點和打印出View-ViewController堆疊中的洩露物件。你也可以使用它檢測其他型別物件的記憶體洩漏問題。

安裝方法
一、手動安裝
1、Add MLeaksFinder to your Target Dependencies and Link Binary With Libraries
在github上下載MLeaksFinder開源庫,將其中的MLeaksFinder資料夾拖入到你的工程中
2、Click your app’s target, then “Build Settings”, search for “Other Linker Flags”, add ‘-ObjC’
選擇你的app的target —> Build Settings —> search for “Other Linker Flags” —> add ‘-ObjC’
這樣就可以了,不需要其他操作了,很簡單吧

二、CocoaPods 安裝

pod 'MLeaksFinder'

使用

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Possibly Memory Leak.
In case that MyTableViewCell should not be dealloced, override -willDealloc 
in MyTableViewCell by returning NO.
View-ViewController stack: (
    MyTableViewController,
    UITableView,
    UITableViewWrapperView,
    MyTableViewCell
)'
當發生記憶體洩露時,會自動打印出哪些控制器和檢視沒有被釋放,會提醒你是否需要釋放,如果不需要釋放(比如單例),需要呼叫willDealloc方法,返回NO

記憶體洩露原因總結
ARC工程是可以重寫dealloc方法,而且當物件被釋放時會被呼叫,但不需要手動呼叫父類的dealloc,當呼叫[super dealloc]方法時會報錯,因為系統會自動幫我們呼叫父類的dealloc方法,不需要重寫;
但有些時候會發現控制器出棧的時候不會呼叫dealloc方法,歸根結底,是因為當前控制器被某些物件 強引用 了,控制器的引用計數不為0,系統無法自動釋放這部分記憶體,導致控制器也不能主動釋放。

控制器被強引用的原因:

1、block塊使用不當,導致迴圈引用。因為block會對方法中的變數自動retain一次。
引用外部變數需要使用 __block
呼叫self 需要 __weak

2、NSTimer沒有銷燬。在viewWillDisappear之前需要把控制器用到的NSTimer銷燬
因為 target:self ,也就是引用了當前viewController,導致控制器的引用計數加1,如果沒有將這個NSTimer 銷燬,它將一直保留該viewController,無法釋放,也就不會呼叫dealloc方法。所以,需要在viewWillDisappear之前需要把控制器用到的NSTimer銷燬。
銷燬方法:

[timer invalidate]; // 銷燬timer
timer = nil; //nil

3.viewController中的代理不是weak屬性
例如代理要使用弱引用

@property (nonatomic, weak) id delegate;

因為代理是被控制器強引用的,所以自己需要使用weak弱引用