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

标签 swift weak-references

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

我的代码如下:

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/

相关文章:

ios - 计算indexPath然后重新加载数据? swift 3

Python:具有短生命周期键的线程安全字典,这是正确的吗?

Xamarin 垃圾收集器和循环引用

swift 4 弱变量

haskell - 为什么指向 MVar 的弱指针最终确定了,即使 MVar 仍然可以访问?

objective-c - 强制 NSLayoutManager 绘制不同字体的字形

ios - 使用核心数据重新排列 TableView 单元格的顺序

ios - 使用 iOS 增加 PFFile 解析上传大小

swift - 谁能告诉我为什么当我按下摄像头按钮时我的应用程序崩溃了

c# - 弱引用和事件处理