快速 KVO 保存对象引用计数



>我在 swift 代码中添加观察器,如下所示:

private var keyValueObservations = [NSKeyValueObservation]()

然后在代码中

let keyValueObservation = session.observe(.isRunning, options: .new) { _, change in
guard let isSessionRunning = change.newValue else { return }
DispatchQueue.main.async {[weak self] in
//  self.recordButton.isEnabled = isSessionRunning
self?.delegate?.cameraSessionStartedRunning(session: self?.session)
}
}
keyValueObservations.append(keyValueObservation)

然后

private func removeObservers() {
for keyValueObservation in keyValueObservations {
keyValueObservation.invalidate()
}
keyValueObservations.removeAll()
}

deinit {
removeObservers()
NSLog("Calling deinit on (type(of: self))")
}

问题是这似乎保存了 self 的引用计数,因此无法通过将对象设置为 nil 来释放对象。因此,Deinit永远不会被召唤。我该如何解决?

这里的问题是,你比你想象的更早地捕捉到自我。 这应该可以解决它:

let keyValueObservation = session.observe(.isRunning, options: .new) { [weak self] _, change in
guard let isSessionRunning = change.newValue else { return }
DispatchQueue.main.async { [weak self] in
//  self.recordButton.isEnabled = isSessionRunning
self?.delegate?.cameraSessionStartedRunning(session: self?.session)
}
}
keyValueObservations.append(keyValueObservation)

所以你看到它是观察器函数的闭包,在调度回主线程时捕获自我而不是。

相关内容

最新更新