情景:控制器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];
}];