我有3个ViewController。 第一个ViewController正在检查用户是否已登录。 如果是,则执行查询到主VC,如果没有执行查看登录VC。
当我在loginVC时,我登录并执行toSeve to mainVC。
我现在想要的是,我想让所有未使用的ViewControllers被“删除”,以节省内存。 这怎么样?
我在StackOverflow中找到了这段代码:
class ManualSegue: UIStoryboardSegue {
override func perform() {
sourceViewController.presentViewController(destinationViewController, animated: true) {
self.sourceViewController.navigationController?.popToRootViewControllerAnimated(false)
UIApplication.sharedApplication().delegate?.window??.rootViewController = self.destinationViewController
}
}
}
这会做我想要的吗?看起来好像是因为这个方法正在弹出ViewController。
我正在使用“显示细节” - 仅限segues,除非使用此方法,我创建了一个自定义的Segue Segue。
答案 0 :(得分:0)
删除应由Apple处理,您(理论上)不应该担心它,只要您不创建任何保留周期。通常,不要在块中对self
有任何强烈的引用。有趣的是,上面的代码,应该解除ViewController(因此删除它)也有一个保留周期。根据需要添加[weak self]
和strongSelf
强制转换应该有所帮助:
override func perform() {
sourceViewController.presentViewController(destinationViewController, animated: true) { [weak self] in
guard let strongSelf = self else { return }
strongSelf.sourceViewController.navigationController?.popToRootViewControllerAnimated(false)
UIApplication.sharedApplication().delegate?.window??.rootViewController = strongSelf.destinationViewController
}
}
答案 1 :(得分:0)
记忆问题
是的,这就是它的工作原理。您无需处理释放视图控制器的问题。
系统将跟踪对视图控制器对象的引用。如果您不再引用这些内容,则会释放内存。您可以在快速语言文档中阅读更多内容:
代码正在做什么
presentViewController
方法以模态方式显示视图控制器。在呈现新视图控制器完成之后执行完成关闭。里面发生了两件事情
popToRootViewController
删除sourceViewController
对象中的所有视图控制器。rootViewController
设置为新值。这实际上将根视图控制器更改为另一个。这似乎是成功登录后的有效操作。
我不知道步骤1是否必要。导航视图控制器无论如何都会消失,为什么要在其中弹出视图控制器呢?
有关视图控制器的更多信息
您可能也对视图控制器生命周期感兴趣。 UIKit开发人员文档包含有关视图控制器的详细信息:
https://developer.apple.com/documentation/uikit/uiviewcontroller