ios:为什么它会马上叫deinit

今天我遇到了一个问题,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) }) } 

我运行这个函数,然后得到一个

致命错误:在展开Optional值时意外发现nil

vc只是为了nil,但我不知道为什么,我该怎么做才能让这段代码变得愉快?

你写了这个:

  weak var vc:SWAddCityViewController! vc = SWAddCityViewController() 

vc变量是“隐式解包的可选”,这意味着它可以指向现有的(未解除分配的)对象,也可以为零。

您创建一个新的SWAddCityViewController对象并将其分配给vc 。 赋值语句完成后,对新对象(在vc )只有一个弱引用,并且没有对它的强引用。 只要对象没有强引用就会释放该对象,因此只要赋值语句完成就会释放该对象。

由于vc是对象的弱引用,因此解除分配对象的一部分将vc设置为nil。 当您尝试在下一行设置vc.delegate时,Swift会生成代码以自动解包vc (因为您已声明它! )。 由于vc为零,因此会出现致命错误。 你不能打开一个设置为nil的可选项,因为它没有包装任何东西。

我没有看到任何理由在该函数中声明vc弱。 只是摆脱weak属性。

您的另一个抱怨是( weak ),该对象以后不会被释放。 你有一个“保留周期”。 您是否使用weak声明了SWAddCityViewControllerdelegate属性? 您通常希望声明delegate属性weak

如果这不能解决问题,则需要查找其中涉及对象的保留周期的其他位置。