Swift KVO保持对象参考计数

问题描述 投票:1回答:1

我在如下的快速代码中添加了观察者:

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。我该如何解决?

ios swift swift4 key-value-observing
1个回答
0
投票
这里的问题是,您捕获自己的时间比您想象的要早。这应该解决它:

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)

因此,您看到的是观察者函数的关闭捕获了自身,而不是在分派回主线程时捕获。”        
© www.soinside.com 2019 - 2024. All rights reserved.