【发布时间】: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 没有被调用两次。
-
一开始我也是这么想的,但除非我找不到合适的方法来检查它...