2017-05-08 70 views
2

在「deinit」方法中沒有命中斷點時會出現主題。解決方案是將可執行代碼放入內部。試過 - 沒有工作。解除視圖控制器後不會調用OSX deinit

的代碼從第一窗口啓動ViewController

let vc = self.storyboard?.instantiateController(withIdentifier: "testwindow") as! NSViewController 
    self.presentViewControllerAsModalWindow(vc) 

它會打開一個按鈕,呼籲點擊下面的代碼

dismissViewController(self) 

和這裏的新窗口是DEINIT代碼與斷點。

deinit code

殭屍對象並不在計劃啓用。

如果在彈出窗口再次出現時重新使用視圖控制器,這將不會成爲問題,但是每次都會創建視圖控制器的新實例。

有什麼辦法可以確保物體被破壞?

+1

我想說你還有一個或多個強大的引用指向你的VC。這種方式在調用解僱時不會被初始化。 – dvdblk

+0

@dvdblk除了我提到的,我沒有任何額外的代碼。這是一個測試項目。故事板有可能以某種方式阻止它被釋放? – Ruzard

+1

@Ruzard在哪個類中調用dismissViewController(self)?視圖的主持人或呈現的視圖。該方法的文檔聲明「要解除模態窗口,請調用self(呈現視圖控制器)上的dismissViewController(_ :)方法。」。這可能是您代碼中的潛在問題。 –

回答

1

蘋果公司解僱使用presentViewControllerAsModalWindow()指出:「要消除模式窗口,調用dismissViewController(呈現控制器文檔_ :)方法在自己(呈現視圖控制器)。「。所以你可能會從提出的控制器中解散出現的控制器。從呈現視圖控制器調用解除將有所幫助。

0

只是試圖複製此之後,你在每個的viewController一個按鈕,使用相同的代碼,然後點擊斷點成功,也改變了從0(viewDidLoad中)的VAR NUM爲1,並返回到0 DEINIT:

你試圖做什麼?當你打開關閉時,是不是調用了deinit方法?

//主視圖控制器

@IBAction func letsGo(_ sender: UIButton) { 
     if let vc = storyboard?.instantiateViewController(withIdentifier: "second") as? SecondViewController { 
      self.present(vc, animated: true, completion: nil) 
     } 
    } 

//其次視圖控制器

class SecondViewController: UIViewController { 

    var num = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     num += 1 
     print("\(num)") 
    } 

    @IBAction func dismissTheHype(_ sender: UIButton) { 
     self.dismiss(animated: true, completion: nil) 
    } 

    deinit { 
     print("deiniting") 

     num -= 1 
     doNothing() 
     print("printing number \(num)") 
    } 

    func doNothing(){ 
     var number = 4 
     number += 1 
     print("\(number) times") 
    } 
} 
+0

我試過你的代碼 - 是的,它確實按預期工作。但是我沒有爲iOS做這件事。我想有架構上的差異。 – Ruzard

+0

順便說一下,OP使用'presentViewControllerAsModalWindow',也就是模態。 – paper1111

相關問題