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

在另一个类中实例化的弱引用在Swift中返回nil,swift,Swift,我一直在试验Swift中的VIPER架构,它暴露了我对弱引用的误解 以下视图控制器引用了演示者(由线框实例化) 如果从视图控制器中创建演示者 class ViewController: UIViewController { weak var presenter: Presenter? override func viewDidLoad() { super.viewDidLoad() let presenterInst = Presenter()

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

以下视图控制器引用了演示者(由线框实例化)

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

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
实用程序):


还要确保在真实项目中进行测试,而不是在操场上!在操场上,内存管理的工作方式与在真实世界中的工作方式不同,因此弱引用实例的消失可能永远不会发生。还要确保在真实项目中进行测试,而不是在操场上!在操场上,内存管理的工作方式与在他在真实世界中工作,因此弱引用实例的消失可能永远不会发生。