Ios 在自动释放池中使用领域的正确方法是什么?

Ios 在自动释放池中使用领域的正确方法是什么?,ios,swift,realm,autorelease,Ios,Swift,Realm,Autorelease,这就是文档中关于使用GCD访问领域的内容: “从调度队列访问域时,应使用显式自动释放池。” 我在我的应用程序中使用过这种做法,但我突然在控制台中看到以下消息: “在写入事务期间解除分配了RLMRealm实例” 它没有抛出错误,只是默默地将其打印到控制台。没有任何内容写入数据库 我发现这个问题似乎很相似 我现在的问题是:我应该使用什么实践?是在领域文档中使用的还是在github问题中找到的答案 感谢您的澄清。GCD块管理自己的@autorelease池,但无法保证何时会发生这种情况,并且可能会在

这就是文档中关于使用GCD访问领域的内容:

“从调度队列访问域时,应使用显式自动释放池。”

我在我的应用程序中使用过这种做法,但我突然在控制台中看到以下消息: “在写入事务期间解除分配了RLMRealm实例”

它没有抛出错误,只是默默地将其打印到控制台。没有任何内容写入数据库

我发现这个问题似乎很相似

我现在的问题是:我应该使用什么实践?是在领域文档中使用的还是在github问题中找到的答案


感谢您的澄清。

GCD块管理自己的
@autorelease
池,但无法保证何时会发生这种情况,并且可能会在块本身完成后的相当长时间内发生(参见此)

Realm跨线程在其所有实例上维护读锁(这就是在另一个线程上打开写事务时仍然可以从Realm读取的方式),因此,建议在完成时显式解除对Realm实例的锁定,以便可以回收磁盘空间

如果您不使用
@autoreleasepool
,那么不会发生太糟糕的事情;只是磁盘上领域文件的大小会增加

最佳实践是使用
@autoreleasepool
块,并确保所有写事务都在该块中提交

@autoreleasepool {
    let realm = try! Realm()
    try! realm.write {
        // ... perform changes
    }
}
通常建议在
beginWrite()
/
commitWrite()
上使用
realm.write
,因为它可以让您安全地执行事务,而不会忘记提交,还提供了一些额外的错误处理


GitHub上的问题在于存在一个逻辑路径,该路径会导致
@autoreleasepool
在提交写事务之前退出。在这种情况下,您需要检查您的代码逻辑,并确保没有类似的代码。

不会发生太糟糕的事情;只是磁盘上的领域文件的大小会增加。
如果需要的时间太长,你的领域大小可能会急剧增加(取决于并发线程的数量)。这在这里不适用。此时长时间运行的事务会增加事务日志的大小。不消耗后台领域实例从来不会显著地增加大小,但它确实会导致它们的增长超过需要。在任何情况下,我们都知道事务日志问题,并正在研究解决方案::)@TiM将使用DispatchQueue(标签:“someLabel”,autoreleaseFrequency:.workItem)。在大多数情况下,async与拥有autorelease池具有相同的效果?完整问题:@hyouuu-Hmm,我从未尝试过那个API,所以我不确定。一般的想法是,您希望确保在调度队列完成其工作后尽快释放对象。它们在内存中停留的时间越长,版本锁定发生的时间就越长(并且您的领域文件大小可能会增加)。在任何情况下,我认为这仍然是一种比根本没有任何autoreleasepool处理要好得多的方法。我们观察到,由于在后台线程上发生的事务周围缺少
autoreleasepool
s,领域文件变得太大而无法打开。它们长得这么大是非常罕见的,而且可能需要很长时间,但这是可能发生的。