2017-02-07 86 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。我絕對不知道發生了什麼。 –