1)不執行dealloc
1.查看是不是循環引用造成的類不銷毀
2.調用其他類的時候查看有沒有將本類中的對象傳過去,例如self,self.tableview
傳的時候注意使用weak,不要使用strong
否則會造成當前類無法釋放,dealloc不執行一直占用內存。
下面我們看一下,怎么樣就會循環引用,以及怎樣處理這種情況
不循環引用.png
上圖的方法,實在UIViewController中的方法,我們可以看到API與self是不存在持有關系的,但是這個block塊,持有API,他們三者之間關系不是互相持有的關系,所以在塊中,[self.dataArray addObject:dic]是不會導致循環引用,也就不需要處理
持有關系.png
我們看這個圖,_pickView是vc的屬性,這樣他們的關系,如上圖,他們這種互相持有,就會導致循環引用,導致內存泄漏。下面我們看解決方法
循環解決.png
就這樣簡單寫一個弱引用,當對象不存在,弱指針指向的這個對象也就沒有了,不會說調用該對象的某個方法,將他的retainCount給+1,導致這個對象不能釋放問題
3.performSelector 關于內存管理的執行原理是這樣的執行
[self performSelector:@selector(method1:) withObject:self.tableLayer afterDelay:3]; 的時候,系統會將tableLayer的引用計數加1,執行完這個方法時,還會將tableLayer的引用計數減1,由于延遲這時tableLayer的引用計數沒有減少到0,也就導致了切換場景dealloc方法沒有被調用,出現了內存泄露。
利用如下函數:
[NSObject cancelPreviousPerformRequestsWithTarget:self] 當然你也可以一個一個得這樣用:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(method1:) object:nil]
加上了這個以后,順利地執行了dealloc方法
4.NSTimer使用造成的內存泄露。
注意自己需要管理NSTimer停止與釋放,否則,會一直運行,導致頁面內存不釋放。
舉個栗子: 在自定義View中,如果不手動停止NSTimer對象,那么會一直NSTimer會一直持有這個類,導致內存不釋放,也就是內存泄露。
解決方法:
在controller中手動調用removeFromSuperView,重寫
- (void)removeFromSuperview 把_timer 停止釋放。
- (void)removeFromSuperview {
[super removeFromSuperview];
[_timer invalidate];
_timer =nil;
}
對于NSTimer這種問題,我們可以寫一個分類 YYKit中類別就可以避免這種情況
也可以看看下面
[帶你點點]http://www.lxweimin.com/p/a1312c1653aa
[此人是土豪,快勾搭]http://www.lxweimin.com/u/c86325c3ac19