Skip to main content
 首页 » 操作系统

ios之Deinit 未在 Show Detail segue 上调用

2024年01月01日55birdshome

我在一个更大的 Swift 项目中遇到了这个问题,但能够用一个非常基本的项目重现它。我有以下 View Controller 类:

class ViewController: UIViewController { 
    deinit { 
        println("Deinitializing") 
    } 
     
    override func viewDidAppear(animated: Bool) { 
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "segue", userInfo: nil, repeats: false) 
    } 
 
    func segue() { 
        self.performSegueWithIdentifier("segue", sender: self) 
    } 
} 

我的 Storyboard配置为有两个 View Controller ,它们都使用上面的类,并且 Show Detail segues 指向彼此。我可以确认它们来回“弹跳”。尽管每次都显示一个新实例,并且没有保留循环,但不会调用先前显示的 View Controller 的 deinit 方法。

我已经能够通过使用自定义 segue 获得我想要的行为,但我的问题是:这种行为是预期的吗?

文档似乎表明它应该按照我的预期工作,我已经突出显示了我认为适用于我的测试项目的部分。

Source

在详情区域展示内容。如果应用程序显示主视图和详细信息 View ,则新内容将替换当前详细信息。 如果应用仅显示主视图或详细信息,则内容将替换当前 View Controller 堆栈的顶部。

我原以为替换当前 View Controller 堆栈的顶部会导致当前 View Controller 被取消初始化。

显示细节的替代方法

作为引用,我能够通过这个 segue 实现我想要的行为(它没有做任何花哨的事情,而且可能是不正确的):

class ExampleSegue: UIStoryboardSegue { 
    override func perform() { 
        let source = self.sourceViewController as UIViewController 
        let destination = self.destinationViewController as UIViewController 
         
        source.view.window?.rootViewController = destination 
    } 
} 

感谢您的帮助!

请您参考如下方法:

如果您不使用导航 Controller 或 Split View Controller ,则“显示详细信息”转场与模式演示相同。呈现另一个 Controller 的 Controller 在其 presentedViewController 属性中保留对它的引用(并且呈现的 Controller 在其 presentingViewController 属性中具有对呈现器的引用)。因此,不会释放任何 Controller 。如果你想回到之前的 Controller ,你应该使用 unwind segue 或在代码中使用 dismissViewControllerAnimated:completion。