1

我在查找视图控制器未发布的原因时遇到了一些麻烦。它只出现在层次结构的顶部,因为它是一个子页面,唯一的目的是与应用程序的其他用户聊天(一个次要功能)。

我已经尝试过使用仪器,我能找到的唯一信息是保留的原因是 UIKit - UIClassSwapper 的一个计数,这对我来说没有多大意义。

在此处输入图像描述

我在控制器中使用以下内容:

  1. Realm - 本地存储聊天记录
  2. Socket IO - 实时发送和接收消息
  3. UITableView+delegate - 显示消息
  4. UITextView+delegate - 输入消息
  5. NotificationCenter - 当键盘出现/消失和应用程序进入背景/前景时的行为

没有使用自定义委托,并且在此控制器中使用了对 self 的显式强引用。聊天气泡具有自定义绘图代码,可添加图层但不需要任何其他视图的引用。

什么可能导致视图控制器被保留?

这很重要,因为保留的每个视图控制器都会导致套接字响应服务器发送的事件。让每个用户在一段时间后计为多个。

请务必提及代码的任何特定部分是否更有可能导致此问题,我会将其添加到我的问题中。整个视图控制器有 400 多行代码,在我的问题中完全包含它是不切实际的。

编辑

我采纳了inokey的建议,分解了各个部分进行调试,导致retain cycle的原因其实是Socket IO。我还重新阅读了 Socket IO 的文档,发现有一种removeAllHandlers()方法可以删除所有可能导致强引用循环的引用。

最后,我没有仔细阅读文档是我的错误-.-

4

2 回答 2

1

当使用 Socket Client 或 Realm Client 等大量外部工具时,这些人有很大的机会获得一些强有力的参考。我想如果问题是导致保留周期的原因,您可以尝试几种方法。

第一的。尝试一一删除原始 MVC 模式中实际上不应该属于 VC 的任何内容。那显然是套接字和领域。理想情况下,它们应该封装在某种服务中并由服务使用。不是直接通过VC。

第二。当您建议它们应该被取消初始化时,检查这些对象是否正在被取消初始化。您可以通过向deinit()它们添加方法来做到这一点。

第三。来自以上两者的是:尝试回答这个问题,你甚至如何初始化这些东西?

对不起,我不能更具体,但我希望这会引导你正确的想法。

于 2017-08-04T07:24:26.713 回答
0

您可以使用 MLeaksFinder 来帮助找出导致回收的原因。

于 2017-08-04T03:57:13.583 回答