查找强引用循环的原因

Finding cause of strong reference cycle

我很难找到未释放 View Controller 的原因。它只出现在层次结构的顶部,因为它是一个子页面,唯一目的是与应用程序的其他用户聊天(一个次要功能)。

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

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

  1. Realm - 本地存储聊天记录
  2. Socket IO - 消息的实时发送和接收
  3. UITableView+delegate - 显示消息
  4. UITextView+delegate - 输入消息
  5. NotificationCenter - 键盘 appears/disappear 和应用输入 background/foreground
  6. 时的行为

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

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

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

如果代码的任何特定部分更有可能导致此问题,请务必提及,我会将其添加到我的问题中。整个view controller 400多行代码,完全放在我的问题里是不切实际的。

编辑

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

到此为止是我没有仔细阅读文档的错误-.-

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

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

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

其次。检查这些对象是否在您建议的时候被取消初始化。您可以通过向它们添加 deinit() 方法来做到这一点。

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

很抱歉我不能说得更具体,但我希望这会引导您产生正确的想法。