调用refreshObject时的核心数据内存峰值(对象,mergeChanges:NO)

时间:2015-01-12 22:32:41

标签: ios core-data magicalrecord

在我调用托管对象上下文后,我在我的对象上调用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

我已经阅读了其他人似乎已成功实施refreshObject的其他Stackoverflow问题:

这是Apple's Object Lifetime Management documentation的相关摘要:

  

当您在托管对象之间建立关系时,每个对象都会对与其相关的一个或多个对象保持强引用。这可能会导致强大的参考周期。为确保引用周期被破坏,当您完成对象时,您可以使用托管对象上下文方法refreshObject:mergeChanges:将其转换为错误。

1 个答案:

答案 0 :(得分:1)

我通过删除performBlockAndWait的所有用途并转而使用performBlock来解决此问题。

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