我在Xcode 8和Swift 2.3中看到了分配工具的奇怪行为。我有一个对象(A),其中deinit
被调用,除了其中一个对象,其中一个引用被释放(就我所知,那个不是一个单独的内存问题) ),但该对象继续被列为" live"并持续在分配工具中。另外,当我尝试调试它的保留时,我看到的只有:
请注意,我已确认deinit正在执行:
A.__deallocating_deinit
方法内的发布(-1)引用计数然而,由于某种未知的原因,它似乎仍然存在。
答案 0 :(得分:1)
经过几个小时的搜索后,我终于设法(大部分)想出来了。
在这种情况下,我有一个类A,它有6个属性,其中一个是类B的实例。类A用类B注册块回调。类B从主运行循环外部接收事件,在一个单独的没有正确包装在@autoreleasepool中的NSThread。结果,B类保留的时间比预期的长,这导致其对A的回调被保留的时间超过预期。
我之所以说“大部分”都认为是因为A级用[unowned self]
注册了所有这些块。由于一个仍然未知的原因,这似乎足以让deinit被执行,但还不足以实际释放该对象。在@autoreleasepool中包装其他线程允许应用程序释放B,这足以释放A。