调用了 deinit 但对象仍在内存中

Deinit Called But Object Still in Memory

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

请注意,我已确认 deinit 正在由以下人员执行:

但是,由于某些未知原因,它似乎一直存在。

经过几个小时的搜索,我终于(大部分)弄明白了。

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

我之所以说 "mostly" 想通了是因为 class A 用 [unowned self] 注册了所有这些块。出于一个仍然未知的原因,这似乎足以让 deinit 被执行,但还不足以真正释放对象。将另一个线程包装在@autoreleasepool 中允许应用程序释放 B,这足以释放 A。