2017-02-07 75 views
0

这似乎出现在我们项目中的两个控制器上。 我检查了代码和故事板,故事板中的segue没有在控制器中调用,没有IBAction也没有与触发segue的按钮相关的IBOutlet。 尽管当我离开我的控制器时,我可以从打印中看到deinit方法被调用两次。Deinit调用两次

这很奇怪,因为viewDidLoad和viewWillDisappear只被调用一次,有没有人遇到过这种行为?没有任何关于SO的双重优惠,我非常想知道发生了什么。

编辑:所以,小小的更新。 我加了这段代码,我设置一个断点来检查当控制器初始化:

 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要到我的控制器,以便初始化编码器被调用一次,当我轻按所述控制器的确定按钮被插入到popSegue中,然后我的控制器再次初始化(也用init编码器),然后发生双重初始化。

那么发生什么事是我的控制器的空实例被创建时,我用popSegue解雇它。我不明白为什么。

+0

你可以发布两个视图控制器的相关代码吗?很难推测没有任何背景或代码的背后原因。 – idocode

+0

事情是,没有代码,只有一个UIButton连接到一个导致故事板引用的segue。 我没有在代码的任何地方调用performSegueWithIdentifier,也没有做任何手动实例化。 与此控制器相关的唯一代码位于prepareForSegue中,如果segue的标识符匹配,我使用它来设置代理。 另外,捕获自己来设置委托的var是一个弱变量,所以没有强大的参考周期的理由。 –

+0

“我也不会做任何手动实例化”我想你会这样做。 – matt

回答

3

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

+0

确实有两个对象,一个是空实例,但我无法弄清楚它来自哪里。 该对象只能由前一个控制器初始化(因为它用于搜索),并且应用程序中任何可触发该对象实例化的唯一位置是故事板中的segue。 的SEGUE是呼吁在赛格瑞与准备: 否则,如果segue.identifier == “goToSearchArtist”{// Segue公司定制 self.navigationController .delegate = arriveFromRightNavigationControllerDelegate ?} ,这是所有没有performSegueWithIdentifier。 –

+0

有没有可以设置断点的init方法?如果没有,也许你应该写一个临时的调试。 – Uncommon

+0

我只写了一个(感谢主角),实际上让我更加困惑。 –

0

故事板可能是这种情况下的罪魁祸首。尝试从故事板中移除您的UIViewController子类并以编程方式创建它。然后应该只调用Deinit。

+0

不幸的是我也试过! 在第一次初始化期间调用第二个init。我绝对不知道发生了什么。 –