没有被称为deinit的解释

时间:2017-01-20 20:57:20

标签: ios swift

我有一个视图控制器(用于登录),它定义了删除观察者的deinit方法。当用户点击Register按钮时,控制器调用performSegueWithIdentifier来加载注册视图控制器。我定义了deinit方法来删除所有观察者。但是,该方法未被调用。我在某处读到它是因为viewcontroller没有被销毁而且指向它的指针被保存在某个地方。有谁可以解释这背后的原因?

谢谢

编辑:虽然我同意评论部分提供的链接持有相同的问题,但没有答案或明确答案。最高的upvoted回复建议在deinit中定义一些内容而不是留空。这并没有回答我正在寻找的探索。出于这个原因,我一直保持这个问题,直到有人能指出我的理解是不正确的。而且,我确实认为马特简明扼要地解释了这一点。

1 个答案:

答案 0 :(得分:15)

在预期时未能触发deinit的常见原因是您有一个保留周期,阻止您的视图控制器不存在。

(有时原因是你希望在这种情况下视图控制器被销毁是不正确的。但假设它是正确的,保留周期就是原因。)

你提到删除所有观察者。什么样的观察者?如果我们谈论的是NSNotification,那通常就是如何获得保留周期。通知中心会保留观察者,直到您取消注册。因此,在移除观察者之后 之前,您无法获得deinit。因此,您无法删除 deinit中的观察者