在我调用托管对象上下文后,我在我的对象上调用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:将其转换为错误。
答案 0 :(得分:1)
我通过删除performBlockAndWait
的所有用途并转而使用performBlock
来解决此问题。
然后我在保存完成时使用NSNotificationCenter
发送消息。