最近在項目中發(fā)現(xiàn)了一個控制器和子視圖釋放不掉的問題构舟。寫此文記錄一下,希望能幫到遇到和我一樣問題的人堵幽。
附上demo下載地址:https://github.com/jiangbin1993/DeallocDemo.git
問題一:在切換根控制器的時候狗超,老的根控制器并沒有釋放掉。
原因:在切換根控制器之前在根控制器上做了modal操作
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:nav animated:YES completion:nil];
解決方法:
在切換根控制器之前先dismiss這些控制器
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
// 必須先把根控制器modal出來的控制器dismiss掉再重設(shè)根控制器 不然之前的根控制器會釋放不掉
[delegate.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
delegate.window.rootViewController = nil;
JJTabbarViewController *vc = [[JJTabbarViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
delegate.window.rootViewController = nav;
問題二:老控制器釋放了朴下,但是老控制器的子視圖沒有釋放
原因一:子視圖里面的定時器沒有銷毀
解決方法: 在控制器的dealloc方法里銷毀掉子視圖的定時器
原因二: 這個項目的控制器結(jié)構(gòu)是appdelegate.window的根控制器是一個UINavigationController 努咐,這個導(dǎo)航控制器的根視圖是UITabbarController。tabbar控制器下是幾個子控制器殴胧。在切換根控制器時會導(dǎo)致tabbar控制器當(dāng)前正在顯示的子控制器的子視圖無法釋放渗稍。
解決方法: 在tabbar控制器所有的子控制器dealloc方法里移除掉所有的子視圖佩迟。
在demo中一開始不移除子視圖,在首頁彈出登陸控制器竿屹,然后切換根控制器报强,發(fā)現(xiàn)所有的控制器和首頁控制器之外的子視圖都釋放了,唯獨首頁控制器的子視圖并沒有釋放拱燃。
控制臺打印 :
2019-02-25 18:10:23.588 TabbarDeallocDemo[96176:723960] tabbar控制器銷毀了
2019-02-25 18:10:23.588 TabbarDeallocDemo[96176:723960] 首頁控制器銷毀
2019-02-25 18:10:23.588 TabbarDeallocDemo[96176:723960] 我的控制器銷毀
2019-02-25 18:10:23.589 TabbarDeallocDemo[96176:723960] 我的contentview銷毀
然后在子控制器的dealloc方法中移除所有子視圖重新運行秉溉,執(zhí)行相同操作。這時所有的控制器和子視圖都釋放了碗誉。
- (void)dealloc {
for (id view in self.view.subviews) {
[view removeFromSuperview];
}
}
控制臺打蛹崾取:
2019-02-25 18:02:35.175 TabbarDeallocDemo[96145:720401] tabbar控制器銷毀了
2019-02-25 18:02:35.175 TabbarDeallocDemo[96145:720401] 我的控制器銷毀
2019-02-25 18:02:35.176 TabbarDeallocDemo[96145:720401] 我的contentview銷毀
2019-02-25 18:02:35.176 TabbarDeallocDemo[96145:720401] 首頁控制器銷毀
2019-02-25 18:02:35.176 TabbarDeallocDemo[96145:720401] 首頁contentview銷毀