【发布时间】:2017-01-26 15:36:04
【问题描述】:
我在 Xcode 8 和 Swift 2.3 中看到分配工具的奇怪行为。我有一个对象 (A),在其上调用 deinit,除了 A 引用的对象之一正在被释放(据我所知,不是一个单独的内存问题),但是对象在分配工具中继续被列为“活动”和持久性。此外,当我尝试调试它的保留时,我看到的只是:
请注意,我已确认 deinit 正在由以下人员执行:
- 在 deinit 方法中添加打印行
- 向 deinit 方法添加断点
- 验证 A 引用的其他对象是否已解除分配,并且它们会收到声称在
A.__deallocating_deinit方法内部发生的释放 (-1) 引用计数
但是,由于某些未知原因,它似乎一直存在。
【问题讨论】:
-
您确定没有该对象的其他引用吗?根据 ARC,在引用计数为 0 之前,对象不会被释放。所以您可能会在其他地方(在其他 VC 中)保留该视图的引用。
-
如果 deinit 被调用(并且已经返回),那么这个对象几乎肯定已经消失了,不管它引用的东西是否还在。通常,如果您遇到此类问题,则会出现您没想到的对象的第二个副本。 (“有第二个你没想到的副本”实际上是各种看似不可能的行为的原因。)检查内存地址。但我要寻找的另一件事是您是否不小心将对象保留在
deinit中。这会让你陷入混乱(但仍然可能不会导致这种症状;我敢打赌额外的副本)。 -
@RobNapier 我确实确认实际上只创建了一个对象。
deinit正在执行,但仍未释放对象。虽然我仍然不能 100% 理解为什么会出现这个问题,但我在下面添加了答案,最终为我解决了这个问题。
标签: ios swift automatic-ref-counting