天天看點

關于performSelector延遲調用後無法走dealloc方法

今天測試項目是否存在bug,然後一直不停的跳界面看是否會導緻崩潰。測試的結果很滿意(小七原以為。。。),但是當決定停止然後測試其他的時候,不經意間瞅了一眼記憶體,竟然達到了400M,用逗逗的話就是瞬間吓尿了。然後果斷重新運作然後繼續測試,直到N次測試之後發現都是這個結果之後,第一反應就是肯定有什麼東西沒釋放導緻沒走dealloc方法,然後每次記憶體都釋放不掉是以一直在遞增。小七緊接着就是不停的開始調試,最終發現果然如此,加載的彈幕沒有釋放。不過看了半天後發現該釋放的都釋放了,為什麼還是不走dealloc方法呢?于是,小七就開始在每個調用到這個對象之後,都列印了一次它的retainCount,最後終于發現了一件事就是使用performSelector延遲調用之後他的引用計數增加了,雖然最後還是釋放,但是如果這個時候我們跳轉界面的話,它的引用計數不為零,也就是說它并不會釋放。

是以接下來小七做的就是各種查找資料然後實驗,最後終于明白了當我們調用performSelector時,系統會将tableLayer的引用計數加1(當然,之後會恢複原樣),但是當我們此時正在切換場景時,延時函數很可能已被調用了,即使他還沒有執行,它引用計數也增加了,而且這時tableLayer并不會恢複為零,是以,顯而易見的就是切換場景dealloc方法沒有被調用,這樣就存在了記憶體洩露。

明白了是什麼原因,小七就開始查找解決的方法,最後終于從一篇大神的部落格中(在這小七十分抱歉的忘記大神的部落格名。。。是以在這要說一下對不起)找到了解決的方法,就是當切換場景時,增加一行代碼:[NSObject cancelPreviousPerformRequestsWithTarget:self],也就是在跳轉場景的時候手動将那些還沒來得及執行的方法取消,這樣它的引用計數就會恢複正常,也就是說可以順利的走dealloc方法,這樣的話就可以解決此處記憶體洩露的問題。之後,小七經過實驗發現确實沒問題,可以保證使用performSelector不會發生記憶體洩露,是以,在這裡記下一筆,用做以後複習整理使用,也希望可以幫助各位。

繼續閱讀