【发布时间】:2019-10-13 04:49:05
【问题描述】:
我对内存管理和 ARC 的整个概念相当陌生。
我最近对其进行了调查,结果喜忧参半。
首先应该注意的是 some ViewController 会取消初始化,但我仍在学习和清理我的应用程序。
但是,我注意到的一个常见模式是,当我使用 navigationController?.popViewController(animated: true) 行时,如果没有强引用,这实际上是 deinit 视图控制器。
但是,我的问题是,当我使用 segue 并使用 performSegue(withIdentifier: "showDetail_Segue", sender: nil) 时,永远不会使用/调用 deinit 方法。 (我只有一个打印语句来指示视图是否已被取消初始化)。在大多数情况下,当我执行 segue 时,我会将数据传递给另一个视图控制器,因此,我使用以下函数 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {}。
我尝试将我的 segue 更改为 navigationController?.pushViewController(VC, animated: true),但我的应用程序崩溃了。
我在这里遗漏了什么吗?
当navigationController 为popped 时取消初始化的ViewControllers 在以编程方式执行segue 时也不会取消初始化。
有人可以告诉我我做错了什么吗?
谢谢。
【问题讨论】:
-
很难说没有看到你的 performSegue 方法。我的猜测是你无意中在那里创建了一个强大的参考。
-
我的
perfomSegue方法是这样的override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "details_Segue" { let detailsVC = segue.destination as! DetailsViewController let text = sender as! String detailsVC.textDescription = text } } -
我重读了你的问题,我想我可能理解错了。让我输入一个答案。
-
听起来你需要使用 unwind segue 来返回之前的 ViewController。请参阅this answer,了解如何创建和以编程方式调用展开转场。
-
@vacawama 正是我想要的!非常感谢。
标签: ios swift automatic-ref-counting deinit