在UIWindow上交换rootViewController不会取消分配视图控制器

时间:2018-11-21 22:03:09

标签: ios uikit

例如,如果您将rootViewController中的UIWindow换出以显示登录窗口,则如果rootViewController已提供(模态)视图控制器,则那些已提供视图控制器和可能不会取消旧的rootViewController

self.window.rootViewController = newViewController

2 个答案:

答案 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)