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