gpt4 book ai didi

swift - 在另一个类中实例化的弱引用在 Swift 中返回 nil

转载 作者:行者123 更新时间:2023-11-28 11:34:55 26 4
gpt4 key购买 nike

我一直在 Swift 中试验 VIPER 架构,它暴露了我对弱引用的误解。

下面的 View Controller 有一个对 presenter 的引用(由线框实例化。

如果我从 View Controller 中创建演示者,

class ViewController: UIViewController {
weak var presenter: Presenter?

override func viewDidLoad() {
super.viewDidLoad()
let presenterInst = Presenter()
presenter = presenterInst
print (presenter)
}
}

我们可以打印演示者的实例 - 太棒了!

如果我使用线框类来做同样的事情,实例为零:

class Wireframe {
static func createViewModule (view: ViewController) {
let presenterInst = Presenter()
view.presenter = presenterInst
}
}


class ViewController: UIViewController {
weak var presenter: Presenter?

override func viewDidLoad() {
super.viewDidLoad()
let presenterInst = Presenter()
presenter = presenterInst
print (presenter)
}
}

这是通过使指向演示者的链接成为强引用来补救的。

那么为什么从另一个类实例化 var 意味着实例变为 nil?

最佳答案

它与“另一个类”无关。一个没有被其他任何东西保留的实例,当分配给弱引用时,迟早会消失。只是在您的第一个代码中,它发生的时间晚了(比您测试它的时候)。

在你的第二个代码中,你测试 after presenter 变成了 nil,所以你确实看到了它。

在您的第一个代码中,您看不到它,因为它发生在打印语句之后:

    let presenterInst = Presenter()
presenter = presenterInst
print (presenter) // it still _looks_ okay...
// but _now_ code ends — and `presenter` is now nil!

为了向自己证明这一点,等待一些时间(使用我的 delay 实用程序):

    let presenterInst = Presenter()
presenter = presenterInst
delay(1) {
print (presenter) // nil
}

关于swift - 在另一个类中实例化的弱引用在 Swift 中返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55718722/

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