gpt4 book ai didi

swift - NSAsynchronousFetchRequest 可能的内存泄漏

转载 作者:可可西里 更新时间:2023-11-01 02:04:08 24 4
gpt4 key购买 nike

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

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

这是仪器的屏幕截图,显示由于 NSAsynchronousFetchRequest 维护对 NSFetchResult 的相互间接引用而导致的明显泄漏

enter image description here

根据 Instruments

,这是触发泄漏的代码片段(删除了所有不必要的代码,即使 [weak self] 仍然没有改变它)
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 {
}

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

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

最佳答案

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

解决这个

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

关于swift - NSAsynchronousFetchRequest 可能的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44517850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com