控制器未走dealloc的原因:
(1).初始化的時候都是先調(diào)用父類的初始化方法,。 同樣的情況可以在viewDidLoad中看到伦吠。而銷毀的時候則是相反的順序驴剔,先銷毀子類里分配的空間,再銷毀父類的婶溯。
(2).控制器中NSTimer沒有被銷毀
當viewController中存在NSTimer時,需要特別注意,當調(diào)用時主胧,因為 target:self ,也就是引用了當前viewController习勤,導致控制器的引用計數(shù)加1踪栋,如果沒有將這個NSTimer 銷毀,它將一直保留該viewController图毕,無法釋放夷都,也就不會調(diào)用dealloc方法。所以予颤,需要在viewWillDisappear之前需要把控制器用到的NSTimer銷毀囤官。
(補充,但是timer 會 retain target蛤虐,不過 target 不一定是 self)
[timer invalidate];//銷毀timertimer =nil;//置nil
(3).viewController中的代理不是weak屬性
例如@property (nonatomic, weak) id delegate;代理要使用弱引用党饮,因為自定義控件是加載在視圖控制器中的,視圖控制器view對自定義控件是強引用驳庭,如果代理屬性設置為strong刑顺,則意味著delegate對視圖控制器也進行了強引用,會造成循環(huán)引用。導致控制器無法被釋放蹲堂,最終導致內(nèi)存泄漏荞驴。
(4).viewController中block的循環(huán)引用
在ARC下,block會把它里面的所有對象強引用贯城,包括當前控制器self熊楼,因此有可能會出現(xiàn)循環(huán)引用的問題。比如viewController中有個block屬性能犯,在block中又強引用了self或者其他成員變量鲫骗,那么這個viewController與自己的block屬性就形成循環(huán)引用,導致viewController無法釋放踩晶。(由于self是__strong修飾执泰,在 ARC 下,當編譯器自動將代碼中的 block 從椂沈撸拷貝到堆時术吝,block 會強引用和持有self,而self恰好也強引用和持有了 block茸苇,就造成了傳說中的循環(huán)引用排苍。)
dealloc里該寫什么以及不該寫什么:
(5).該寫什么:從 NotificationCenter remove observer,remove KVO学密,有些非 ARC 管理的比如 CFRelease淘衙,有些流要關(guān)閉,用了 RAC 持有 disposable 對象的可以 dispose腻暮,這些都是比較常見的彤守。還有一些會 removeGestureRecognizer,addToRunLoop 的 removeFromRunLoop哭靖,dispatch_release 掉自己持有的 queue具垫,不過這些可能不是必要的。
(6).不該寫什么:不要調(diào) super dealloc试幽,實際上想調(diào)也調(diào)不了…… ARC 下編譯器會自動調(diào)的筝蚕;在 init 方法和 dealloc 方法里都不要用點語法,而是直接用下劃線 _property 進行存取抡草。(因為點語法會觸發(fā) getter饰及、setter 方法,不知道這些方法會被重寫成什么康震,可能會涉及或者觸發(fā)一些不該在 dealloc 階段做的事比如 KVO 之類)燎含。