解除视图控制器后不会调用OSX deinit

问题描述:

在“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(_ :)方法。”。这可能是您代码中的潜在问题。 –

苹果公司解雇使用presentViewControllerAsModalWindow()指出:“要消除模式窗口,调用dismissViewController(呈现控制器文档_ :)方法在自己(呈现视图控制器)。“。所以你可能会从提出的控制器中解散出现的控制器。从呈现视图控制器调用解除将有所帮助。

只是试图复制此之后,你在每个的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