show segue 后我的视图控制器没有被取消初始化

Posted

技术标签:

【中文标题】show segue 后我的视图控制器没有被取消初始化【英文标题】:My viewcontroller is not being deinitialized after show segue 【发布时间】:2016-08-29 10:56:43 【问题描述】:

我创建了两个视图控制器,每个控制器都有一个按钮,用于显示与另一个视图控制器的连接。

var counter = 0
class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        counter += 1

        print("init viewc \(counter)")
    

    deinit 
        counter -= 1
        print("deinit viewc \(counter)")
    

似乎从来没有调用过deinit,每次我返回ViewController,计数器都在增加:

init viewc 1
init viewc 2
init viewc 3

等等...我在这里错过了什么吗?我认为 show segue 应该从内存中释放调用者,因为它不再需要。我现在每次 segue 时都会创建新的 ViewController 对象吗?

【问题讨论】:

您是否在 Storyboard 中连接的 VC 之间进行模态转换? 不,我选择了“显示”,而不是“模态呈现” 您是否尝试通过实例化来展示您的 VC? 不,我想通过 segueing 使其工作,因为我在另一个项目中有内存泄漏。看起来像这样的 segueing 可能不会像我期望的那样起作用,因为据我所知,视图控制器并没有被淘汰(所以这可能是泄漏的原因?)。 尝试模态呈现 【参考方案1】:

由于您使用的是“显示”segue,因此您每次都在创建一个新的视图控制器实例,从而有效地向顶部展示更深的视图控制器“堆栈”。

如果您想在视图控制器的单个实例之间来回切换,则可以使用容器视图控制器,例如 UITabBarController 或使用 UINavigationController 并操作 viewControllers 属性

【讨论】:

我设法解决了这个问题,方法是转到一个视图控制器,然后展开回第一个视图控制器(第一个视图控制器保留但被重用,第二个被删除)。没有导航控制器持有它们。这是一个好的解决方案还是会带来其他问题? IE。这样做时是否应该始终将它们包含在导航控制器中? 不,放松转场很好。如果没有导航控制器,那么您只是在第一个视图控制器上模态显示第二个视图控制器,然后在您放松时丢弃第二个。【参考方案2】:

如果您试图释放在您想要保留的视图控制器之前出现的视图控制器,并且 f 您不打算执行 unwind segue 并返回之前的 view controller 的最新状态,并且如果您想解除分配先前的视图控制器,那么您实质上是将后面的视图控制器之一视为新的rootViewController,并且直到您重新分配AppDelegate 上的根视图控制器属性,第一个视图控制器将不会被解除分配由于rootViewController 对其有很强的引用。

UIApplication.shared.keyWindow?.rootViewController = VCTwo

【讨论】:

以上是关于show segue 后我的视图控制器没有被取消初始化的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6.1 的 segue 动作列表中没有“显示”

Swift 3 - 调用准备 segue 时视图不更新

Swift - Segue 没有被传递正确的数据

performSegueWithIdentifier 方法对于模态 segue 非常慢

在 twitter iOS 应用程序中,segue 没有在视觉上执行

Xcode segue 有时会导致后屏