为什么removeAllObservers()无法在deinit中运行?

时间:2017-12-08 19:32:28

标签: ios swift firebase

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

每当你在视图控制器中观察时,

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

然而!

经过大量测试后,您无法在clearObservations()中致电deinit - 您必须在viewDidDisappear(或其他合理位置)调用它。

再次 - 在deinit中明确 无效

我的问题是,为什么实际上这不适用于deinit

顺便说一句,你启动这样的Firebase观察站:

say, viewWillAppear#

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

        self.blah(snapshot)
    })

1 个答案:

答案 0 :(得分:3)

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

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

在忘记将无主权放在境界观察方法之前,我有同样的问题。