【问题标题】:Deinit called twiceDeinit 调用了两次
【发布时间】:2017-06-25 00:24:35
【问题描述】:

这似乎出现在我们项目的两个控制器上。 我检查了代码和情节提要,情节提要中的转场没有在控制器中调用,没有与将触发转场的按钮相关的 IBAction 或 IBOutlet 。 虽然当我离开我的控制器时,我可以从打印中看到 deinit 方法被调用了两次。

这很奇怪,因为 viewDidLoad 和 viewWillDisappear 只被调用了一次,以前有人遇到过这种行为吗?与 SO 上的双重 deinit 没有任何关系,我非常想了解发生了什么。

编辑:所以,更新很少。 我添加了这段代码,我设置了一个断点来检查控制器何时初始化:

        override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

}

required init(coder aDecoder: NSCoder) {
    print("init coder style")
    super.init(coder: aDecoder)!
}

所以当我触发 segue 到达我的控制器时,init coder 被调用一次,当我点击插入 popSegue 的所述控制器的 ok 按钮时,我的控制器然后第二次初始化(也使用 init coder),然后发生双重 deinit。

所以发生的情况是,当我使用 popSegue 将其关闭时,会创建一个空的控制器实例。我不明白为什么。

【问题讨论】:

  • 你能发布两个视图控制器的相关代码吗?没有任何上下文或代码,很难推测其背后的原因。
  • 问题是,没有代码,只有一个 UIButton 连接到一个连接到一个故事板引用的 segue。我没有在代码中的任何地方调用 performSegueWithIdentifier,也没有进行任何手动实例化。与此控制器相关的唯一代码在 prepareForSegue 中,如果 segue 的标识符匹配,我将使用它来设置委托。此外,捕获 self 以设置委托的 var 是弱 var,因此没有理由使用强引用循环。
  • “我也不做任何手动实例化”我想你会。
  • 不,我没有,我已经手动检查代码并使用 xcode 上的搜索功能,如果我没有看到控制器的名称出现在任何地方,则无法手动实例化.也没有调用 performSegueWithIdentifier 所以我的 segue 没有被调用两次。
  • 一开始我也是这么想的,但除非我找不到合适的方法来检查它...

标签: swift xcode deinit


【解决方案1】:

我的第一个想法是也许你实际上有两个对象。尝试在deinit 上设置断点,并查看两次对象的指针值是否相同。

【讨论】:

  • 确实有两个对象,一个是空实例,但我不知道它来自哪里。该对象只能由前一个控制器初始化(因为它用于搜索),并且应用程序中唯一会触发该对象实例化的地方是情节提要中的 segue。调用 segue 为 segue 做准备: else if segue.identifier == "goToSearchArtist" { //custom segue self.navigationController?.delegate =arriveFromRightNavigationControllerDelegate } 仅此而已,没有 performSegueWithIdentifier。
  • 有没有可以设置断点的init方法?如果没有,也许你应该写一个临时的调试。
  • 我只写了一个(感谢领导),实际上它让我更加困惑。
  • 很棒的电话@Uncommon
【解决方案2】:

在这种情况下,故事板可能是罪魁祸首。尝试从情节提要中删除您的 UIViewController 子类并以编程方式创建它。那时应该只调用 Deinit 。

【讨论】:

  • 不幸的是我也试过了!在第一个 deinit 期间调用第二个 init。我完全不知道发生了什么。
猜你喜欢
  • 2013-01-21
  • 2012-09-08
  • 2016-04-27
  • 2019-02-27
  • 1970-01-01
  • 2019-12-04
  • 2018-09-15
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多