gpt4 book ai didi

ios - 为什么 removeAllObservers() 在 deinit 中不起作用?

转载 作者:搜寻专家 更新时间:2023-10-31 22:25:54 24 4
gpt4 key购买 nike

众所周知,在 iOS 中使用 Firebase 时,

每当您在 View Controller 中进行观察时,

var o: DatabaseReference?
var o2: DatabaseReference?
var o3: DatabaseReference?

重要的是,当屏幕消失时,您必须终止所有观察...

private func clearObservations() {

print("\n\n clearing observations! \n\n")

if o != nil {

o?.removeAllObservers()
o = nil
}

if o2 != nil {
etc...
}

但是!

经过大量测试后,您不能在 deinit 中调用 clearObservations() - 您必须在 viewDidDisappear(或其他一些逻辑位置)中调用它.

同样 - 它在 deinit 中明确不起作用

我的问题是,为什么这实际上在 deinit 中不起作用?


顺便说一句,你像这样启动一个 Firebase 观察器:

say, viewWillAppear#

o = Database.database().reference(withPath: "string")
o!.observe(.value, with: { (snapshot) in

self.blah(snapshot)
})

最佳答案

我相信您的问题可能是 deinit 根本没有被调用,通常这种情况是因为您的观察者闭包强烈保留 self 并且闭包本身由 firebase 服务保留。这意味着你的对象永远不会死。您可以使用 unownedweak 捕获来打破这种循环。

要检查是否是这种情况,请在您的 deinit 中打印一个。如果打印没有在您期望的时候被调用,那么对象就没有被释放,您应该运行内存调试器来查看还有谁在指向它。

我之前遇到过同样的问题,当时我忘记将 unowned 放在 realm observe 方法上。

关于ios - 为什么 removeAllObservers() 在 deinit 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47721013/

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