这不是纯粹的好奇心,我可能会误解一些关于Swift中弱引用的事情。
假设我从View Controller创建一个类,并将其引用传递给初始化程序:
class = MyClass(vc: self)
由于情节提要和窗口已经保留了对该View Controller的引用,因此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
。
禁止非可选的弱数据的原因是什么?
答案 0 :(得分:5)
weak
变量的确切定义是,该变量不会增加对象的引用计数,更重要的是,对于您的问题,变量值将在设置为nil
时自动设置为viewController
。引用的对象被释放。
由于变量必须允许nil值,因此它必须是可选的。这就是为什么不允许非可选的弱变量。
请勿声明!
被隐式解包(使用?
)。使其成为适当的可选项(使用{{1}})。