IOS中POP控制器 但是並沒有被銷毀


周六加班,真是個讓人悲傷的故事。今天改BUG的時候 發現了一個問題,我的控制器注冊了幾個監聽方法。當我pop掉這個控制器的時候,看似是從棧里移除掉了,然而當廣播發來的時候,依舊響應了監聽方法,這就很尷尬了。於是我跟蹤了一下代碼,發現當我pop之后根本沒有走到deinit方法(swift) 也就是OC中的dealloc 方法。好吧,今天我就總結一下 當碰到這種情況的時候如何去 找到問題,或者說 在我們平時寫代碼的時候 如何避免這些問題發生。

歸根結底,這種情況的發生就是當前控制器被某個對象強引用,在控制器pop 的時候count沒有減為0,引用計數器不為0 系統就不會為你釋放這部分內存。

我總結了一個,控制器沒有被銷毀無非就以下三種情況:

1.block塊使用不當。因為blocak會對方法中的變量自動retain一次。所以,大家先檢查以下自己控制器中的blocak代碼。具體怎么寫就不說了,weak。

2.計時器NSTimer沒有被銷毀,記得在viewWillDisappear之前把控制器用到的計時器銷毀。 (不管是重復性的timer還是一次性的timer都會對它的方法的接收者進行retain,這兩種timer的區別在於“一次性的timer在完成調用以后會自動將自己invalidate,而重復的timer則將永生,直到你顯式的invalidate它為止)

3.控制器中的代理一定要用弱引用,不要用強引用。 (這點應該是出現最少的情況,相信大家最初學習IOS代理這塊的時候,已經被告知“先就這么寫,不要管為什么”,於是基本上大家都是寫成weak)

好了,這是今天在工作中碰到的問題,給大家分享下,如果有別的高見,請在下面留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM