Deinit被召唤但对象仍在记忆中

时间:2016-09-19 03:12:01

标签: ios swift automatic-ref-counting

我在Xcode 8和Swift 2.3中看到了分配工具的奇怪行为。我有一个对象(A),其中deinit被调用,除了其中一个对象,其中一个引用被释放(就我所知,那个不是一个单独的内存问题) ),但该对象继续被列为" live"并持续在分配工具中。另外,当我尝试调试它的保留时,我看到的只有:

enter image description here

请注意,我已确认deinit正在执行:

  • 向deinit方法添加打印行
  • 在deinit方法中添加断点
  • 验证A引用的其他对象是否已取消分配,并且它们收到声称发生在A.__deallocating_deinit方法内的发布(-1)引用计数

然而,由于某种未知的原因,它似乎仍然存在。

1 个答案:

答案 0 :(得分:1)

经过几个小时的搜索后,我终于设法(大部分)想出来了。

在这种情况下,我有一个类A,它有6个属性,其中一个是类B的实例。类A用类B注册块回调。类B从主运行循环外部接收事件,在一个单独的没有正确包装在@autoreleasepool中的NSThread。结果,B类保留的时间比预期的长,这导致其对A的回调被保留的时间超过预期。

我之所以说“大部分”都认为是因为A级用[unowned self]注册了所有这些块。由于一个仍然未知的原因,这似乎足以让deinit被执行,但还不足以实际释放该对象。在@autoreleasepool中包装其他线程允许应用程序释放B,这足以释放A。