为什么removeAllObservers()不能在deinit中工作?

众所周知,在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... } 

然而!

经过相当多的testing之后,您不能在deinit调用clearObservations() ,您必须在viewDidDisappear (或其他某个逻辑位置)中调用它。

再次 – 它明确地不起作用

我的问题,为什么实际上这不起作用呢?


顺便说一下,您启动了一个Firebase观察器,如下所示:

 say, viewWillAppear# o = Database.database().reference(withPath: "string") o!.observe(.value, with: { (snapshot) in self.blah(snapshot) }) 

我相信你的问题可能是deinit没有被调用,通常这种事情是因为你的观察者closures强烈地保留自我,closures本身被firebase服务保留。 这意味着你的对象永远不会死亡。 你可以用一个unownedweak捕获来打破这种循环。

要检查是否属于这种情况,请在您的退出中打印一张照片。 如果打印没有被调用,当你期望那么对象没有被释放,你应该运行内存debugging器,看看还有谁指着它。

我以前也有同样的问题,忘记把无主观察方法。