在另一个类中实例化的弱引用在Swift中返回nil
我一直在试验Swift中的VIPER架构,它暴露了我对弱引用的误解 以下视图控制器引用了演示者(由线框实例化) 如果从视图控制器中创建演示者在另一个类中实例化的弱引用在Swift中返回nil,swift,Swift,我一直在试验Swift中的VIPER架构,它暴露了我对弱引用的误解 以下视图控制器引用了演示者(由线框实例化) 如果从视图控制器中创建演示者 class ViewController: UIViewController { weak var presenter: Presenter? override func viewDidLoad() { super.viewDidLoad() let presenterInst = Presenter()
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意味着实例变为nil呢?它与“另一个类”无关。一个没有被其他任何东西保留的实例,当分配给弱引用时,迟早会消失。只是在您的第一个代码中,它发生得晚(比您测试它时晚)
在第二个代码中,您在presenter
变为nil后进行测试,因此您实际上看到了它
在第一个代码中,您看不到它,因为它发生在print语句之后:
let presenterInst = Presenter()
presenter = presenterInst
print (presenter) // it still _looks_ okay...
// but _now_ code ends — and `presenter` is now nil!
为了向自己证明这一点,请留出一些时间(使用我的delay
实用程序):
它与“另一个类”无关。一个没有被其他任何东西保留的实例,当分配给弱引用时,会消失——迟早会消失。只是在您的第一个代码中,它发生得晚(比您测试它时晚)
在第二个代码中,您在presenter
变为nil后进行测试,因此您实际上看到了它
在第一个代码中,您看不到它,因为它发生在print语句之后:
let presenterInst = Presenter()
presenter = presenterInst
print (presenter) // it still _looks_ okay...
// but _now_ code ends — and `presenter` is now nil!
为了向自己证明这一点,请留出一些时间(使用我的delay
实用程序):
还要确保在真实项目中进行测试,而不是在操场上!在操场上,内存管理的工作方式与在真实世界中的工作方式不同,因此弱引用实例的消失可能永远不会发生。还要确保在真实项目中进行测试,而不是在操场上!在操场上,内存管理的工作方式与在他在真实世界中工作,因此弱引用实例的消失可能永远不会发生。