NSAsynchronousFetchRequest 可能的内存泄漏

NSAsynchronousFetchRequest possible memory leak

问题: 使用 xcode 工具分析一个 iOS 应用程序,它看起来很小但很重要(该代码段在整个项目中间接执行) 内存泄漏。

描述:我们不使用实体引用并遵循典型的苹果建议的核心数据对象上下文堆栈

这是仪器的屏幕截图,显示由于 NSAsynchronousFetchRequest 维护对 NSFetchResult

的相互间接引用而造成的明显泄漏

根据Instruments[=,这是触发泄漏的代码片段(删除了所有不必要的代码,即使[weak self]仍然没有改变它) 14=]

let anEntityFetch = NSFetchRequest<NSFetchRequestResult>(entityName: AnEntity.entityName)

let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: rangeQuantityFetch) { (asynchronousFetchResult) -> Void in
    //
}

do {
    // commenting out the execute there is no leak anymore
    _ = try managedObjectContext.execute(asyncFetchRequest)

} catch {
}

启用编译优化标志也会发生同样的事情。

问题:是否有可能它只是一个 Instruments 或 xcode 错误?或者这是一个已知的核心数据问题?或者任何有用的提示来解决我的问题来源将不胜感激。

这似乎是核心数据对象上下文堆栈的问题。在配置中,我们有一个主上下文,它有一个写上下文作为父上下文,它有实际的持久性协调器。 根据 memory-leak-on-nspredicate-that-used-in-fetch-request-to-fetch-nsmanagedobject 的说法,问题出在有父级的主上下文中。

解决这个

  • 按照答案中的指示更改核心数据堆栈
  • 或(似乎 工作但不是一个干净的解决方案)扩展 NSAsynchronousFetchRequest 设置为 nil request 属性 在完成块被调用之后(这样引用周期是 已损坏,资源可由 ARC 重新分配)。