情景:控制器A present: 控制器B present:控制器C:切換根控制器:控制器D
問題:如果 在C跳轉(zhuǎn)到D的跳轉(zhuǎn)方法中直接寫:[UIApplication sharedApplication].delegate.window.rootViewController = [ViewControllerD new]; A、B篡撵、C三個控制器都不會得到釋放(不走dealloc方法)
解決辦法:根據(jù)self.presentingViewController可以獲取到當前控制器的父控制器,可以用循環(huán)實現(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三個控制器才都會得到釋放
Notice:但是發(fā)現(xiàn)了新的問題
由于D中沒有任何東西音羞,甚至連背景色都沒添加囱桨!所以在切換根視圖控制器后,發(fā)現(xiàn)D視圖上居然顯示出最底部A視圖的界面嗅绰!再確認根控制器確實是D并且A舍肠、B、C都進入dealloc中銷毀掉后窘面,WTF 翠语?視圖銷毀后它的視圖不應(yīng)該就沒有了嗎,實在是想不通财边。
解決辦法:經(jīng)測試發(fā)現(xiàn) 釋放A肌括、B、C是個耗時操作酣难,需要一定得時間(先釋放C谍夭,最后釋放A,有順序的),故只有當釋放完成再執(zhí)行切換根控制器的操作才不會有此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];
}];