Ios 调用refreshObject时的核心数据内存峰值(对象,合并更改:否)

Ios 调用refreshObject时的核心数据内存峰值(对象,合并更改:否),ios,core-data,magicalrecord,Ios,Core Data,Magicalrecord,在对托管对象上下文调用save之后,我正在对我的对象调用refreshObject:mergeChanges:NO,以将它们转换为错误。然而,这造成了内存使用的激增 我试图将对象转化为故障,以中断引用周期,从而释放内存 如果不调用refreshObject,我的应用程序可以运行30-40分钟,然后因为占用太多ram而被杀死。然而,如果我在每次上下文保存后调用它,那么它只会持续几分钟 这是我的核心数据堆栈: # Persistent Store Coordinator <--+-- priv

在对托管对象上下文调用save之后,我正在对我的对象调用
refreshObject:mergeChanges:NO
,以将它们转换为错误。然而,这造成了内存使用的激增

我试图将对象转化为故障,以中断引用周期,从而释放内存

如果不调用
refreshObject
,我的应用程序可以运行30-40分钟,然后因为占用太多ram而被杀死。然而,如果我在每次上下文保存后调用它,那么它只会持续几分钟

这是我的核心数据堆栈:

# Persistent Store Coordinator <--+-- privateWriterContext (NSPrivateQueueConcurrencyType)
#                                            |
#                                            +----- defaultManagedObjectContext (NSMainQueueConcurrencyType) # for the main thread
#                                                   |
#                                                   +----- backgroundManagedObjectContext (NSPrivateQueueConcurrencyType) # for bg tasks
我已经阅读了其他Stackoverflow问题,其中其他人似乎成功地实现了
refreshObject

这是相关的片段:

当托管对象之间存在关系时,每个对象都会维护对与其相关的一个或多个对象的强引用。这可能导致强引用循环。为了确保引用周期被打破,当您完成一个对象时,可以使用托管对象上下文方法refreshObject:mergeChanges:将其转化为故障


我通过删除
performBlock和wait的所有用法来解决这个问题,并改为使用
performBlock


然后,我使用
NSNotificationCenter
在保存完成时发送一条消息。

您只在私有上下文中刷新对象。在主线程上下文中,它们可能仍然处于活动状态(并占用内存)。主线程显示来自托管对象的数据,因此它必须将数据从持久存储加载到内存中。在主上下文的注册对象上调用
refreshObject
是否有帮助?我在privateWriterContext或我的defaultManagedObjectContext上尝试了几种刷新或不刷新的组合–我可以看到注册对象的数量降到零。但它仍然只是加速了无限内存的增长。
if privateWriterContext.MR_saveToPersistentStoreAndWaitWithError(error)
    privateWriterContext.performBlockAndWait(
      lambda {
        privateWriterContext.registeredObjects.each do |object|
          privateWriterContext.refreshObject(object, mergeChanges: false)
        end
      }.weak!
    )
else
  # handle error
end