众所周知,在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
?
say, viewWillAppear#
o = Database.database().reference(withPath: "string")
o!.observe(.value, with: { (snapshot) in
self.blah(snapshot)
})
答案 0 :(得分:3)
我相信你的问题很可能是deinit
根本没有被调用,通常这种情况是因为你的观察者关闭强烈地保留了自己,并且关闭本身由firebase服务保留。这意味着你的对象永远不会死。您可以使用unowned
或weak
捕获来打破此类循环。
要检查是否是这种情况,请在您的deinit中打印。如果没有调用打印,那么对象就不会被释放,你应该运行内存调试器来查看还有谁指向它。
在忘记将无主权放在境界观察方法之前,我有同样的问题。