【问题标题】:Realm notifications that capture [weak self] in Swift在 Swift 中捕获 [弱自我] 的领域通知
【发布时间】:2016-09-16 07:15:25
【问题描述】:

在 Swift 的 Realm 文档中,notifications 部分有以下示例代码:

class ViewController: UITableViewController {
  var notificationToken: NotificationToken? = nil

  override func viewDidLoad() {
    super.viewDidLoad()
    let realm = try! Realm()
    let results = realm.objects(Person.self).filter("age > 5")

    // Observe Results Notifications
    notificationToken = results.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
      guard let tableView = self?.tableView else { return }
      // ... some code removed here ...
    }
  }

  deinit {
    // notificationToken?.invalidate() in Realm 10.12
    notificationToken?.stop()
  }
}

我想知道为什么这里使用[weak self] 而不是[unowned self]。在什么用例中self 在这里可以为零? (在到达deinit之前)

【问题讨论】:

  • Apple 说“使用弱引用只要它有效,该引用在其生命周期中的某个时刻变为 nil。相反,当您知道引用永远不会为零时,请使用无主引用已在初始化期间设置。”
  • 也许你的答案在这里stackoverflow.com/questions/24468336/…

标签: ios swift realm


【解决方案1】:

在这种特定情况下,它永远不可能是nil,因为在调用stop() 之后永远不会调用通知块,而unowned 就可以了。使用weak 只是为了在有人将代码复制并粘贴到看似相似的情况下使其更加健壮,这实际上并不能保证self 永远不会是nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多