NSAsynchronousFetchRequest可能的内存泄漏

时间:2017-06-13 09:43:56

标签: swift core-data memory-leaks swift3 instruments

问题:使用xcode工具分析iOS应用程序似乎是一个小但非常关键的(片段是在整个项目中间接执行的)内存泄漏。

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

以下是工具的屏幕截图,显示由于NSAsynchronousFetchRequest维持对NSFetchResult

的相互间接引用而导致的明显泄漏

enter image description here

根据乐器

,这是触发泄漏的代码片段(删除所有非必要代码,甚至[弱自我]仍然没有改变它)
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错误?或者它是一个已知的核心数据问题?或任何有用的提示,以解决我的问题来源将非常感激。

1 个答案:

答案 0 :(得分:1)

核心数据对象contexts堆栈似乎是问题。在配置中,我们有一个主上下文,它具有一个具有实际持久性协调器的写上下文。 根据{{​​3}},问题在于主要背景是父母。

解决这个

  • 按照答案中的指示更改核心数据堆栈
  • 或(似乎 工作,但不是一个干净的解决方案)扩展[[1;2]; [3]] |> List.collect id // [1; 2; 3] 设置为nil NSAsynchronousFetchRequest属性 在调用完成块之后(这样参考循环是 破坏和资源可以由ARC解除分配。