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

问题描述 投票:0回答:1

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

以下View Controller具有对演示者的引用(由线框实例化)。

如果我从视图控制器中创建演示者,

class ViewController: UIViewController {
    weak var presenter: Presenter? 

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

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

如果我使用线框类来执行相同操作,则实例为nil:

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意味着实例变为零?

swift
1个回答
2
投票

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

在你的第二个代码中,你在presenter变为零之后进行测试,所以你实际上看到了它。

在你的第一个代码中,你没有看到它,因为它发生在print语句之后:

    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
    }
© www.soinside.com 2019 - 2024. All rights reserved.