情景:控制器A present: 控制器B present:控制器C:切換根控制器:控制器D
問題:如果 在C跳轉(zhuǎn)到D的跳轉(zhuǎn)方法中直接寫:[UIApplication sharedApplication].delegate.window.rootViewController = [ViewControllerD new]; A、B、C三個(gè)控制器都不會(huì)得到釋放(不走dealloc方法)
解決辦法:根據(jù)self.presentingViewController可以獲取到當(dāng)前控制器的父控制器,可以用循環(huán)實(shí)現(xiàn)
UIViewController *parentVC = self.presentingViewController;
UIViewController *bottomVC;
while (parentVC) {
bottomVC = parentVC;
parentVC = parentVC.presentingViewController;
}
[bottomVC dismissViewControllerAnimated:YES completion:nil];
[UIApplication sharedApplication].delegate.window.rootViewController = [ViewControllerD new];
這樣的話,A、B、C三個(gè)控制器才都會(huì)得到釋放
Notice:但是發(fā)現(xiàn)了新的問題
由于D中沒有任何東西,甚至連背景色都沒添加!所以在切換根視圖控制器后,發(fā)現(xiàn)D視圖上居然顯示出最底部A視圖的界面!再確認(rèn)根控制器確實(shí)是D并且A、B、C都進(jìn)入dealloc中銷毀掉后,WTF ?視圖銷毀后它的視圖不應(yīng)該就沒有了嗎,實(shí)在是想不通。
解決辦法:經(jīng)測試發(fā)現(xiàn) 釋放A、B、C是個(gè)耗時(shí)操作,需要一定得時(shí)間(先釋放C,最后釋放A,有順序的),故只有當(dāng)釋放完成再執(zhí)行切換根控制器的操作才不會(huì)有此bug。
//把最前面的視圖控制器dismiss掉
UIViewController *parentVC = self.presentingViewController;
UIViewController *bottomVC;
while (parentVC) {
bottomVC = parentVC;
parentVC = parentVC.presentingViewController;
}
[bottomVC dismissViewControllerAnimated:NO completion:^{
//dismiss后再切換根視圖
[UIApplication sharedApplication].delegate.window.rootViewController = [TabBarController new];
}];