Ios 是先调用init?(aDecoder:)还是先调用prepareforsgue(u:sender:)?

Ios 是先调用init?(aDecoder:)还是先调用prepareforsgue(u:sender:)?,ios,swift,initialization,uikit,Ios,Swift,Initialization,Uikit,简介 我试图调试我的程序,我遇到了一个问题。我收到swift错误:在展开可选值时意外发现nil。此问题来自隐式展开的可选值。错误在ViewControllerB的init?(aDecoder:)中,我设置值的位置在ViewControllerA的prepareForSegue(uquo:sender:)中,它使用“显示序列”转到ViewControllerB 问题 这让我觉得ViewControllerB中的init?(aDecoder:)方法是在ViewControllerA中的prepare

简介
我试图调试我的程序,我遇到了一个问题。我收到swift错误:
在展开可选值时意外发现nil。
此问题来自隐式展开的可选值。错误在ViewControllerB的
init?(aDecoder:)
中,我设置值的位置在ViewControllerA的
prepareForSegue(uquo:sender:)
中,它使用“显示序列”转到ViewControllerB

问题

这让我觉得ViewControllerB中的
init?(aDecoder:)
方法是在ViewControllerA中的
prepareforsgue(\uu:sender:)
之前调用的。我说得对吗?

是的。在应用程序中的其他地方使用对象之前,始终对其进行初始化


如果需要执行的工作取决于所设置的属性,则通常可以从属性上的
didSet
观察者或
viewDidLoad()
方法中触发该工作。

是。在应用程序中的其他地方使用对象之前,始终对其进行初始化


如果需要执行的工作取决于所设置的属性,则通常可以从属性上的
didSet
观察者或
viewDidLoad()
方法中触发该工作…由于该对象可通过
segue.destinationViewController
访问,因此该对象可能已经初始化。尽管我不太同意“始终”,因为该对象在技术上可以延迟初始化,但该对象肯定会被初始化。你在考虑懒惰的属性吗?这不是对象本身的初始化。对象本身必须先初始化,然后才能用于
prepareforsgue()
。传递给方法的
UISegue
对象也是如此,但是
UISegue
destinationViewController
属性理论上可能会被延迟加载。(但这都是语义,因为
UISegue
不是这样工作的。)当然,它可以延迟加载。但你说的是属性分配,不是对象初始化。始终首先初始化对象。若要展开:“在其他地方使用之前”…由于对象可通过
segue.destinationViewController
访问,因此对象可能已初始化,尽管我不太同意“始终”由于对象在技术上可以延迟初始化,因此对象肯定会被初始化。你在考虑懒惰的属性吗?这不是对象本身的初始化。对象本身必须先初始化,然后才能用于
prepareforsgue()
。传递给方法的
UISegue
对象也是如此,但是
UISegue
destinationViewController
属性理论上可能会被延迟加载。(但这都是语义,因为
UISegue
不是这样工作的。)当然,它可以延迟加载。但你说的是属性分配,不是对象初始化。对象总是先初始化。