寻找强参考周期的原因

时间:2017-08-04 03:47:39

标签: ios swift strong-references

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

我已经尝试过使用乐器了,我能找到的唯一信息是保留的原因是UIKit的一个数 - UIClassSwapper对我来说没什么意义。

enter image description here

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

  1. 领域 - 在本地存储聊天记录
  2. 套接字IO - 实时发送和接收消息
  3. UITableView + delegate - 显示消息
  4. UITextView +委托 - 输入消息
  5. NotificationCenter - 键盘出现/消失且app进入后台/前景
  6. 时的行为

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

    可能导致视图控制器被保留的原因是什么?

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

    请注意,如果代码的任何特定部分有更高的机会导致此问题,我会将其添加到我的问题中。整个视图控制器有超过400行代码,在我的问题中完全没有它是不切实际的。

    修改

    我采取了inokey的建议并将每个部分分解为调试,保留周期的原因实际上是Socket IO。我还重读了Socket IO的文档,发现有一个removeAllHandlers()方法将删除可能导致强引用周期的所有引用。

    最后,我没有仔细阅读文档--.-

2 个答案:

答案 0 :(得分:1)

当使用很多外部资源(如Socket Client或Realm Client)时,这些人有很多机会可以获得强大的参考资料。我想如果问题是导致保留周期的原因,你可以尝试一些方法。

首先。尝试逐个删除任何不应该属于原始MVC模式中的VC的内容。那显然是socket和领域。理想情况下,它们应该封装在某种服务中并由服务使用。不是由VC直接。

二。检查这些对象是否在您建议的时候被取消初始化。您可以通过向其添加deinit()方法来实现。

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

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

答案 1 :(得分:0)

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