我很难找到未发布 View Controller 的原因。它只出现在层次结构的顶部,因为它是一个子页面,唯一目的是与应用程序的其他用户聊天(一个次要功能)。
我已经尝试过使用工具,我能找到的唯一信息是保留的原因是 UIKit - UIClassSwapper 的一个计数,这对我来说没有多大意义。
我在 Controller 中使用以下内容:
- Realm - 在本地存储聊天记录
- Socket IO - 实时发送和接收消息
- UITableView+delegate - 显示消息
- UITextView+delegate - 输入消息
- NotificationCenter - 键盘出现/消失以及应用进入后台/前台时的行为
没有使用自定义委托(delegate),并且在该 Controller 中使用了对自身的显式强引用。聊天气泡具有自定义绘图代码,可以添加图层但不需要任何其他 View 的引用。
是什么导致了 View Controller 被保留?
这很重要,因为保留的每个 View Controller 都会导致套接字响应服务器发送的事件。一段时间后让每个用户都算作多个用户。
如果代码的任何特定部分更有可能导致此问题,请务必提及,我会将其添加到我的问题中。整个 View Controller 有 400 多行代码,在我的问题中完全包含它是不切实际的。
编辑
我采纳了inokey的建议,把每一部分都分解了调试,retain cycle的原因其实是Socket IO。我还重新阅读了 Socket IO 的文档,发现有一个 removeAllHandlers()
方法可以删除所有可能导致强引用循环的引用。
最后是我没有仔细阅读文档的错误-.-
最佳答案
当使用大量外部东西(如 Socket Client 或 Realm Client)时,很有可能获得这些人的一些强有力的引用。我想如果问题是导致保留周期的原因,您可以尝试几种方法。
首先。尝试一一删除任何实际上不应该属于原始 MVC 模式中的 VC 的东西。这显然是套接字和领域。理想情况下,它们应该封装在某种服务中并由服务使用。不是直接用VC的。
其次。检查这些对象是否在您建议的时候被取消初始化。您可以通过向它们添加 deinit()
方法来做到这一点。
第三。来自以上两者的是:尝试回答这个问题,你是如何初始化这些东西的?
很抱歉,我不能说得更具体,但我希望这会引导您产生正确的想法。
关于ios - 查找强引用循环的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497953/