未调用 deinit 的解释

Posted

技术标签:

【中文标题】未调用 deinit 的解释【英文标题】:explanation for deinit not called 【发布时间】:2017-01-20 20:57:19 【问题描述】:

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

谢谢

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

【问题讨论】:

***.com/a/33580360/1979882 来自 Swift documentation:“...... 可以编写代码,其中类的实例 从不 达到它的强引用为零的程度。如果两个类实例相互持有强引用,则可能会发生这种情况,这样每个实例都会使另一个实例保持活动状态。这称为强引用循环。" Deinit never called的可能重复 【参考方案1】:

未能按预期触发deinit 的通常原因是您有一个保留周期,它会阻止您的视图控制器消失。

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

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

【讨论】:

我的书在这里讨论了通知的异常内存管理:apeth.com/iosBook/… 是的,它是 NSNotification,我正试图从 deinit 中删除这些观察者。所以我的问题是......我正在从 denint 中删除观察者,并且只有在删除观察者时才会调用 denint。感谢您的详细解释和链接!

以上是关于未调用 deinit 的解释的主要内容,如果未能解决你的问题,请参考以下文章

当这行代码执行时 deinit() 停止调用

永远不会调用 Deinit 方法 - Swift Playground

调用了 Deinit 但对象仍在内存中

完成处理程序导致不调用 Deinit

没有在 UIViewController 上调用 Deinit,但 Dealloc 是

从内存中删除 UIView 时,快速 deinit 方法不起作用