我有FakeSplashController
执行一些网络请求,然后打开WelcomeViewController
。当我在WelcomeViewController
中查看记忆图时,我发现SplashViewController
仍在那里。我在deinit
中调用FakeSplashController
函数来检查它是否正在拒绝,但它没有调用它。可能是什么问题?
在WelcomeViewController
中我在记忆中看到的内容:
FakeSplashController:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setupUI()
networkRequests()
}
func networkRequests(){
AppInitService().initAppRequest { [](result) in
switch result{
case .success(_):
self.startAnimation()
return
case .error(let error):
UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
return
}
}
}
func openApp(){
let loginController = WelcomeViewController()
self.present(loginController, animated: true)
}
func startAnimation(){
UIView.animate(withDuration: 0.8, animations: {
self.logoImage.frame.origin.x -= 100
}, completion: nil)
UIView.animate(withDuration: 1,delay: 0.3,animations: {
self.textLogo.alpha = 1
self.textLogo.frame.origin.x += 50
}, completion: { _ in
self.openApp()
})
}
deinit {
print("Splash Deinited")
}
编辑:当我在下面发帖时,有人提到了这一点;
除非你做一些非常专业的事情,否则你不需要在Swift中取消初始化对象。当引用计数变为0时,它将自动调用。如果您真的需要,您应该能够通过AppDelegate设置窗口的rootViewController。
所以我不需要把它作为一个问题吗? Best way to deinit Initial view controller?
答案 0 :(得分:3)
正如我在评论中所说,你的代码中没有什么奇怪的,这就是iOS框架的工作原理;视图控制器未被释放,因为它仍然是当前窗口的rootViewController
。
我不认为非常需要解除分配,但如果你真的需要这样做,解决方案可能是用你的rootViewController
替换WelcomeViewController
。通过替换它,启动屏幕的引用计数将变为0并将被取消分配。
像
guard let window = UIApplication.shared.keyWindow else {
return
}
self.dismiss(animated: false, completion: nil)
window.rootViewController = WelcomeViewController()
问题在于没有动画(但你也可以实现动画,只是找到如何动画rootViewController
更改)