我在如下的快速代码中添加了观察者:
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)
因此,您看到的是观察者函数的关闭捕获了自身,而不是在分派回主线程时捕获。”