例如,如果您将rootViewController
中的UIWindow
换出以显示登录窗口,则如果rootViewController
已提供(模态)视图控制器,则那些已提供视图控制器和可能不会取消旧的rootViewController 。
self.window.rootViewController = newViewController
答案 0 :(得分:2)
UIKit对象通常使用autorelease在内部发布。这意味着不能保证立即释放它们。但是,您可以通过包装应使用autoreleasepool释放对象的函数来强制解除分配。
autoreleasepool {
self.window.rootViewController = newViewController
}
要详细了解自动释放池和自动释放池,请查看this answer。
答案 1 :(得分:0)
换出rootViewController时,您必须总是取消所有模态,否则会有一个保留周期。
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)