在Swift中捕获[弱自我]的领域通知

时间:2016-09-16 07:15:26

标签: ios swift realm

在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?.stop()
  }
}

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

1 个答案:

答案 0 :(得分:2)

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