現(xiàn)在iOS開發(fā)中大部分都是用了自動引用計數(shù)器的齿穗,內(nèi)存管理基本上是編譯器幫我們處理了,唯一要自己的處理的就是循環(huán)引用泽论。在網(wǎng)上有很多教程告訴我們該如何避免循環(huán)引用夺蛇。如代理用weak修飾,block要類似__weak ViewController *weakSelf = self; 這樣處理副渴。我知道這些奈附,大部分開發(fā)者都是懂的。但是很時候會忘記煮剧,或者想的不夠多斥滤。例如 某ViewController持有AView和BView,而且AView是加在BView上的勉盅,這種情況很多時候是很難發(fā)現(xiàn)的佑颇,所以我們需要工具幫助我們排查。上次在Android上用了LeakCanary之后草娜,查找內(nèi)存泄漏挑胸,修復(fù)bug的效率高多了,這次還是一樣宰闰,介紹一下iOS上面的工具-MLeaksFinder茬贵。這個工具的介紹有很多,我就不多說了移袍,我更關(guān)心的是如何用起來解藻,最近一個項目,我小試牛刀咐容,效果立竿見影舆逃。如果內(nèi)存泄漏,會在控制臺打印如下的信息
*** 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
)'
那該怎樣處理呢戳粒? 其實控制臺的信息已經(jīng)告訴我們了 MyTableViewCell should not be dealloced, override -willDealloc in MyTableViewCell by returning NO路狮,重寫MyTableViewCell的-(void)willDealloc方法,將里面引用外面的東西置為nil就好了蔚约。處理之后重新運行就不會再提示了奄妨。是不是很簡單呢?工具幫助我們提高效率苹祟。
還有一種情況是block的循環(huán)引用砸抛,這個是無法列出堆棧的评雌。只能靠自己觀察,在block使用weakSelf直焙,還有一個值得主要的是例如某屬性:
@property (nonatomic,strong) UILabel *titleLabel;
而你在block里面這樣使用了
_titleLabel.text=xx
這樣也是不行的景东。但是這個我們很容易忽略。
我覺得一個好的習(xí)慣就是在每個對象了里面都重寫-(void)willDealloc奔誓,將全部屬性都置為nil斤吐,這樣就可以防范于未然了。雖然這個工具只能幫助我們檢測ViewController上面的內(nèi)存泄漏厨喂,但是通過修復(fù)bug可以更好的規(guī)范我們的代碼和措。
其實xcode也提供了工具幫助我們檢測循環(huán)引用了,
點擊它就可以看到當(dāng)前所有對象的引用關(guān)系了
有沒有循環(huán)引用蜕煌,一眼就看出來了派阱。