【发布时间】:2019-10-07 01:33:29
【问题描述】:
如果您将rootViewController 换成UIWindow,例如,以显示一个登录窗口,如果rootViewController 已显示(模态)视图控制器,那些已显示的视图控制器,可能还有旧的rootViewController 不会被释放。
self.window.rootViewController = newViewController
【问题讨论】:
如果您将rootViewController 换成UIWindow,例如,以显示一个登录窗口,如果rootViewController 已显示(模态)视图控制器,那些已显示的视图控制器,可能还有旧的rootViewController 不会被释放。
self.window.rootViewController = newViewController
【问题讨论】:
UIKit 对象通常在内部使用autorelease 发布。这意味着他们不能保证立即被释放。但是,您可以通过包装应该使用自动释放池释放对象的函数来强制解除分配。
autoreleasepool {
self.window.rootViewController = newViewController
}
有关自动释放和自动释放池的详细说明,请查看this answer。
【讨论】:
您必须始终在换出 rootViewController 时关闭所有 modals,否则会有一个保留循环。
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
如果你想做一个漂亮的过渡,你总是可以用动画包裹它:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)
【讨论】:
self.myWindow?.rootViewController?.dismiss(animated: false, completion: { self.myWindow?.rootViewController = newViewController })
presentedViewController,我稍后会做一些测试