ios:为什么它会马上叫deinit

时间:2016-04-22 02:22:05

标签: ios swift

今天我遇到了一个问题,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,但我不知道为什么,我该怎么办才能使这段代码感到满意?

1 个答案:

答案 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

如果这不能解决问题,您需要寻找其他涉及对象的保留周期的地方。