ios - 查找强引用循环的原因

标签 ios swift strong-references

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

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

enter image description here

我在 Controller 中使用以下内容:

  1. Realm - 在本地存储聊天记录
  2. Socket IO - 实时发送和接收消息
  3. UITableView+delegate - 显示消息
  4. UITextView+delegate - 输入消息
  5. 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/

相关文章:

ios - 检查域名的有效性

iOS Pandora like 底部工具栏

ios - 从 IOS 中的返回键执行按钮单击

ios - 如何在应用程序关闭时删除图像缓存?

swift - 如何在 Swift 的 macOS 项目中获取当前打开文档的文件路径?

swift - 使用 Swift 验证 AWS Cognito token

java - 弱引用、强引用和垃圾收集

swift - 深入了解 Swift 中的弱引用和无主引用

java - 强引用类

objective-c - XCode - 显示/删除 NSDocumentDirectory 中的文件