問題
在處理一個viewcontroller的時候,從viewcontroller A push到viewcontroller B,然后從viewcontroller B pop到viewcontroller A僧凤,理論上viewcontroller B會主動調(diào)用- (void)dealloc;這個方法,但是經(jīng)過調(diào)試的時候,發(fā)現(xiàn)實際上并沒有執(zhí)行這個方法,也就是說viewcontroller B一直沒被銷毀情妖。因為在viewcontroller B中使用了addObserver睬关,所以如果viewcontroller B如果一直不被銷毀的話,每次push過去后毡证,addObserver會多次添加电爹,造成會在執(zhí)行的時候多次執(zhí)行的問題。
分析原因
造成viewcontroller無法銷毀的原因常見的有以下幾點:
1料睛、使用NSTimer丐箩,在pop后,沒有對timer進行釋放秦效,導致控制器無法被銷毀雏蛮。
2、循環(huán)引用導致的控制器無法銷毀阱州,使用block,在block內(nèi)對當前控制器進行強引用
3法梯、delegate的強引用問題導致控制器無法銷毀苔货,一般我們在定義delegate的時候使用weak修飾
解決問題
在我的viewcontroller B 中使用了NSTimer以及block,NSTimer在viewWillDisappear中我已經(jīng)進行了[timer?invalidate]; timer = nil; 的操作立哑,所以夜惭,排除了timer導致的無法銷毀問題。檢查block部分的使用情況铛绰,注釋掉所有block部分的代碼诈茧,然后運行發(fā)現(xiàn)程序執(zhí)行了dealloc方法,定位到問題捂掰,就好解決了敢会,逐步取消部分的block的注釋,后來定位到的問題是在調(diào)用刷新控件的block中強引用self導致的當前控制器無法釋放这嚣。一時的疏忽鸥昏,導致被這個小問題折磨了一下。
注意:
以上問題中涉及到添加監(jiān)聽通知的使用姐帚,這就是dealloc如果不執(zhí)行的話吏垮,我們無法移除監(jiān)聽,導致每次進入到viewcontroller B頁面罐旗,監(jiān)聽都會被添加一次膳汪,會出很大問題的。所以在使用監(jiān)聽的時候一定要記得removeObserver九秀。