gpt4 book ai didi

即使 self 保持存在,Swift 弱引用也会变为 nil

转载 作者:搜寻专家 更新时间:2023-10-31 21:46:20 24 4
gpt4 key购买 nike

我试图弄清楚为什么即使对象保持存在,弱引用也会丢失其引用的对象。

我的代码如下:

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 实例)后,假定丢失的对象的内存图的样子:

Memory graph showing two main references to the object

上面的子树应该保持对象存活,而底部的子树与当前堆栈执行有关。在第 3 级(从右到左)中被许多其他对象引用的对象(蓝色框)持有对数组的强引用,而数组又持有对 MyClass 实例的引用。

编辑:问题已在下面的答案中解决。冷却时间过后将标记为已解决。

最佳答案

问题解决了。好的,所以我不知道发生了什么,但在多次尝试调试后它自行修复。仍然存在问题的一件事是调试器在闭包内将 self 显示为 nil(这在调试过程中增加了重要时间),但是 guard 让 block 成功执行,我获得了对该对象的强引用。

关于即使 self 保持存在,Swift 弱引用也会变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com