解除视图控制器后不会调用OSX deinit
问题描述:
在“deinit”方法中没有命中断点时会出现主题。解决方案是将可执行代码放入内部。试过 - 没有工作。解除视图控制器后不会调用OSX deinit
的代码从第一窗口启动ViewController
:
let vc = self.storyboard?.instantiateController(withIdentifier: "testwindow") as! NSViewController
self.presentViewControllerAsModalWindow(vc)
它会打开一个按钮,呼吁点击下面的代码
dismissViewController(self)
和这里的新窗口是DEINIT代码与断点。
僵尸对象并不在计划启用。
如果在弹出窗口再次出现时重新使用视图控制器,这将不会成为问题,但是每次都会创建视图控制器的新实例。
有什么办法可以确保物体被破坏?
答
苹果公司解雇使用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")
}
}
我想说你还有一个或多个强大的引用指向你的VC。这种方式在调用解雇时不会被初始化。 – dvdblk
@dvdblk除了我提到的,我没有任何额外的代码。这是一个测试项目。故事板有可能以某种方式阻止它被释放? – Ruzard
@Ruzard在哪个类中调用dismissViewController(self)?视图的主持人或呈现的视图。该方法的文档声明“要解除模态窗口,请调用self(呈现视图控制器)上的dismissViewController(_ :)方法。”。这可能是您代码中的潜在问题。 –