今天我遇到了一个问题,vc从不打电话给deinit,所以我添加了一个弱点
func showAddCityViewController() {
weak var vc:SWAddCityViewController!
vc = SWAddCityViewController()
vc.delegate = self
let nav = UINavigationController(rootViewController: vc)
dispatch_async(dispatch_get_main_queue(), {
self.presentVC(nav)
})
}
我运行此功能然后获得
致命错误:在解包可选值时意外发现nil
vc只是为了nil,但我不知道为什么,我该怎么办才能使这段代码感到满意?
答案 0 :(得分:4)
你写了这个:
weak var vc:SWAddCityViewController!
vc = SWAddCityViewController()
vc
变量是“隐式解包的可选”,这意味着它可以指向现有的(未解除分配的)对象,也可以为零。
您创建一个新的SWAddCityViewController
对象并将其分配给vc
。赋值语句完成后,只有一个对新对象的弱引用(在vc
中),并且没有强引用。一旦对象没有强引用就会被释放,因此只要赋值语句完成就会释放它。
由于vc
是对象的弱引用,因此将对象集vc
解除分配为零的一部分。当您尝试在下一行设置vc.delegate
时,Swift会生成代码以自动解包vc
(因为您使用!
声明了它)。由于vc
为零,因此会出现致命错误。您无法将可选项设置为nil,因为它没有包装任何内容。
我没有看到任何理由在该功能中声明vc
弱。只需摆脱weak
属性。
您的另一个抱怨是(使用weak
)该对象以后无法解除分配。你有一个“保留周期”。您是否使用delegate
声明了SWAddCityViewController
的{{1}}属性?您通常要声明weak
属性delegate
。
如果这不能解决问题,您需要寻找其他涉及对象的保留周期的地方。