未调用 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 方法 - Swift Playground