在托管对象上下文上调用 save 后,我正在对对象调用 refreshObject:mergeChanges:NO
以将它们变成错误。但是,这会导致内存使用量激增。
我试图将对象变成错误,以打破引用周期,以便释放内存。
如果不调用refreshObject
我的应用程序能够运行 30-40 分钟,然后因消耗过多内存而被杀死。但是,如果我在每次上下文保存后调用它,那么它只会持续几分钟。
这是我的核心数据堆栈:
# Persistent Store Coordinator <--+-- privateWriterContext (NSPrivateQueueConcurrencyType)
# |
# +----- defaultManagedObjectContext (NSMainQueueConcurrencyType) # for the main thread
# |
# +----- backgroundManagedObjectContext (NSPrivateQueueConcurrencyType) # for bg tasks
这是我用来持久然后刷新对象的代码
if privateWriterContext.MR_saveToPersistentStoreAndWaitWithError(error)
privateWriterContext.performBlockAndWait(
lambda {
privateWriterContext.registeredObjects.each do |object|
privateWriterContext.refreshObject(object, mergeChanges: false)
end
}.weak!
)
else
# handle error
end
我已经阅读了其他Stackoverflow问题,其他人似乎已经成功地实现了refreshObject
:
- 核心数据 - 打破父上下文的保留周期
- 导入大型数据集时的核心数据存储使用情况
这是 Apple 对象生存期管理文档的相关片段:
在托管对象之间建立关系时,每个对象都维护对与其相关的一个或多个对象的强引用。这可能会导致强参考周期。若要确保引用循环被中断,在完成对象处理后,可以使用托管对象上下文方法 refreshObject:mergeChanges: 将其转换为错误。
我通过删除performBlockAndWait
的所有用法并改用performBlock
来解决此问题。
然后,我使用 NSNotificationCenter
在保存完成后发送消息。