且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

即使在ARC下,在GCD中使用Realm时也必须使用显式自动释放池

更新时间:2023-02-17 14:00:00

您实际上不必每次都使用显式的自动释放池.它与您执行大量并发事务并且很容易陷入跟踪多个即时版本的风险的情况下更为相关.或者,当您要确保通过释放所有打开的访问器来确保在应用程序的生命周期内关闭Realm文件时.

You don't really have to use an explicit autorelease pool every time. It is more relevant for scenarios where you do a lot of concurrent transactions and could easily run into the risk of tracking to many immediate versions. Or when you want to make sure that you close the Realm file in the lifetime of your app by releasing all open accessors to it.

与一般的***实践相比,文档在这一点上的理解更多是为了了解技术局限性,并提示一旦遇到类似问题,如何解决该问题.当然,您总是可以这样做,并且不一定会伤害您(例如,如果您有锤子,一切都看起来像钉子."),但不一定必须这样做.

The docs are at this point more to understand as a making aware of technical limitations and a hint how to resolve that once you hit an issue like that than a general best practice. Sure, you could always do that and it wouldn't necessarily hurt you (à la "If you have a hammer, everything looks like a nail."), but you wouldn't necessarily have to do it.

这并不是每个人都需要的复杂含义.了解显式自动释放池需要对ARC进行更深入的了解,这不是一般要求.如果您有想法,可以如何更好地解决,那么欢迎您提供反馈.

The extra complication of what this exactly means is not required for everyone. Understanding explicit autorelease pools needs a deeper understanding of ARC that is not a general requirement. If you have ideas, how that could be resolved in a better way, your feedback is more than welcome.

在线程间使用领域举一个例子,在后台队列中插入一百万个对象:

The section Using a Realm Across Threads gives an example for that, inserting a million objects in a background queue:

dispatch_async(queue) {
  autoreleasepool {
    // Get realm and table instances for this thread
    let realm = try! Realm()

    // Break up the writing blocks into smaller portions
    // by starting a new transaction
    for idx1 in 0..<1000 {
      realm.beginWrite()

      // Add row via dictionary. Property order is ignored.
      for idx2 in 0..<1000 {
        realm.create(Person.self, value: [
          "name": "\(idx1)",
          "birthdate": NSDate(timeIntervalSince1970: NSTimeInterval(idx2))
        ])
      }

      // Commit the write transaction
      // to make this data available to other threads
      try! realm.commitWrite()
    }
  }
}

通常具有合理数量的对象创建,例如在单独的自动释放池中创建对象,因为您无法使用ARC真正预测何时将释放对象,因此您有明确的时间点,何时将对象释放最晚,这使您的程序对您和其他人确定性地理解.

It generally makes sense to have object creations in a number like that in a separate autoreleasepool as you can't really predict with ARC when the object releases will happen and so you have an explicit point in time, when they will happen latest, which makes your program more deterministically to understand for you and other humans.