我试图弄清楚为什么即使对象保持存在,弱引用也会丢失其引用的对象。
我的代码如下:
MyClass {
deinit {
print("I'm being deinited") // This never gets called
}
func doConnection(connection: Future<Data, ServerConnectionError>) {
Future<Void, ServerConnectionError> { complete in
connection.onSuccess {[weak self] data in
guard let strongSelf = self else {
return // This line gets called
}
...
}
}
}
}
通过检查内存图,我可以看到在 future 完成之前由 self 引用的对象仍然存在(根据内存地址判断)。
这是在发现其弱引用为 nil(最右边的 MyClass 实例)后,假定丢失的对象的内存图的样子:
上面的子树应该保持对象存活,而底部的子树与当前堆栈执行有关。在第 3 级(从右到左)中被许多其他对象引用的对象(蓝色框)持有对数组的强引用,而数组又持有对 MyClass 实例的引用。
编辑:问题已在下面的答案中解决。冷却时间过后将标记为已解决。
最佳答案
问题解决了。好的,所以我不知道发生了什么,但在多次尝试调试后它自行修复。仍然存在问题的一件事是调试器在闭包内将 self
显示为 nil
(这在调试过程中增加了重要时间),但是 guard 让
block 成功执行,我获得了对该对象的强引用。
关于即使 self 保持存在,Swift 弱引用也会变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229046/