gpt4 book ai didi

Swift:保持对弱变量的强引用

转载 作者:行者123 更新时间:2023-12-02 16:08:08 24 4
gpt4 key购买 nike

我有一个对其委托(delegate)有弱引用的类。在后台操作中,我需要设置委托(delegate),对类执行操作,然后释放委托(delegate)。

下面的代码在 Debug 模式下工作,但在 Release 模式下失败,因为在 Release 模式下委托(delegate)会立即被释放。

protocol DocumentDelegate:class { ... }

class MyDocument {
weak var delegate:DocumentDelegate?

func save() {
assert(self.delegate =! nil)
}
}

// Later:

// (#1) Using "var" does not work:
var delegate:DocumentDelegate? = InterimDelegate()

let document = MyDocument()

document.delegate = delegate

// Compiled in Release mode, at this time the delegate is already nil!
document.save()

delegate = nil


// (#2) Using "let" does work:
let delegate:DocumentDelegate = InterimDelegate()

let document = MyDocument()

document.delegate = delegate

// Compiled in Release mode, at this time the delegate is already nil!
document.save()

我假设最后一条指令 delegate = nil 会导致编译器保留委托(delegate)直到那时(即“最后”使用变量的时间)。但是,考虑一下,编译器优化代码并立即释放委托(delegate)实例确实是有道理的,因为没有其他强引用。

但是,我不明白为什么在使用“let”时编译器在第二种情况下的行为方式不同。在这里,编译器也可以看到委托(delegate)没有通过其他任何地方的强引用被引用,但它确实会保留它直到 block 结束。

考虑这个问题的好方法是什么?保持对弱委托(delegate)的强引用的好方法是什么?

最佳答案

虽然我完全同意 Rob Napier 的分析,但为了完整起见,我应该指出,您也可以将对象的生命周期明确化:

let delegate = InterimDelegate()

withExtendedLifetime(delegate) {
let document = MyDocument()
document.delegate = delegate
document.save()
}

关于Swift:保持对弱变量的强引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68784936/

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