我在查找视图控制器未发布的原因时遇到了一些麻烦。它只出现在层次结构的顶部,因为它是一个子页面,唯一的目的是与应用程序的其他用户聊天(一个次要功能)。
我已经尝试过使用仪器,我能找到的唯一信息是保留的原因是 UIKit - UIClassSwapper 的一个计数,这对我来说没有多大意义。
我在控制器中使用以下内容:
- Realm - 本地存储聊天记录
- Socket IO - 实时发送和接收消息
- UITableView+delegate - 显示消息
- UITextView+delegate - 输入消息
- NotificationCenter - 当键盘出现/消失和应用程序进入背景/前景时的行为
没有使用自定义委托,并且在此控制器中使用了对 self 的显式强引用。聊天气泡具有自定义绘图代码,可添加图层但不需要任何其他视图的引用。
什么可能导致视图控制器被保留?
这很重要,因为保留的每个视图控制器都会导致套接字响应服务器发送的事件。让每个用户在一段时间后计为多个。
请务必提及代码的任何特定部分是否更有可能导致此问题,我会将其添加到我的问题中。整个视图控制器有 400 多行代码,在我的问题中完全包含它是不切实际的。
编辑
我采纳了inokey的建议,分解了各个部分进行调试,导致retain cycle的原因其实是Socket IO。我还重新阅读了 Socket IO 的文档,发现有一种removeAllHandlers()
方法可以删除所有可能导致强引用循环的引用。
最后,我没有仔细阅读文档是我的错误-.-