这不仅是出于好奇,我也有一种可能会误解Swift中弱引用的感觉。
假设我从一个视图控制器创建一个类,并将其引用传递给初始化程序:
然而,这段代码出现编译错误,因为viewController变量不是可选的。所以我不得不在viewController声明中添加'!'并删除初始化程序,只留下
为什么不允许非可选的弱数据?
假设我从一个视图控制器创建一个类,并将其引用传递给初始化程序:
class = MyClass(vc: self)
由于故事板和窗口已经保留对此视图控制器的引用,因此MyClass拥有弱引用似乎是合理的(出于与在IB中创建的所有引用默认为弱引用相似的原因):
class MyClass: NSObject {
private weak var viewController: UIViewController
init(vc: UIViewController) {
self.viewController = vc
super.init
}
func setViewController(_ vc: UIViewController) {
self.viewController = vc
}
...
}
然而,这段代码出现编译错误,因为viewController变量不是可选的。所以我不得不在viewController声明中添加'!'并删除初始化程序,只留下
setViewController
,看起来相当不自然。为什么不允许非可选的弱数据?
viewController
时发生什么?UIStoryboard
反序列化VC的新实例,然后放弃其所有权。如果它是窗口的contentViewController
,则窗口拥有它。如果合适,你的对象也可以拥有它。 - rob mayoffweak
或unowned
。如果是weak
,则必须是Optional
。如果是unowned
,则不能是Optional
。 - rob mayoff