gpt4 book ai didi

ios:为什么它立即调用 deinit

转载 作者:行者123 更新时间:2023-11-28 10:19:35 25 4
gpt4 key购买 nike

今天遇到一个问题,vc从来不调用deinit,所以我加了一个weak

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)
})
}

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

fatal error: unexpectedly found nil while unwrapping an Optional value

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

最佳答案

你写了这个:

    weak var vc:SWAddCityViewController!
vc = SWAddCityViewController()

vc 变量是一个“隐式展开的 Optional”,这意味着它可以指向一个现有的(未释放的)对象,也可以是 nil。

您创建一个新的 SWAddCityViewController 对象并将其分配给 vc。赋值语句完成后,只有一个对新对象的弱引用(在 vc 中)并且没有对它的强引用。一个对象一旦没有强引用就会被释放,所以它会在赋值语句完成后立即被释放。

由于 vc 是对该对象的弱引用,因此释放对象的部分操作将 vc 设置为 nil。当您尝试在下一行设置 vc.delegate 时,Swift 会生成代码以自动解包 vc(因为您使用 ! 声明了它)。因为 vc 是 nil,你会得到一个 fatal error 。你不能打开一个设置为 nil 的可选,因为它没有包装任何东西。

我看不出有任何理由在该函数中声明 vc 弱。只需去掉 weak 属性即可。

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

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

关于ios:为什么它立即调用 deinit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com