iOS dealloc 不執行或延遲執行的問題

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容