繁体   English   中英

Deinit被称为但对象仍在记忆中

[英]Deinit Called But Object Still in Memory

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

在此输入图像描述

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

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

然而,由于一些未知的原因,它似乎坚持下去。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM