我一直在试验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意味着实例变为零?
它与“另一个班级”无关。当被分配给弱引用时,没有被其他任何东西保留的实例将会消失 - 迟早会消失。只是在你的第一个代码中,它发生在以后(比你测试时)。
在你的第二个代码中,你在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
}