【发布时间】:2016-07-10 01:56:47
【问题描述】:
我今天发现了一个内存泄漏,当我从我的 main NSManagedObjectContext 调用 executeFetchRequest 时,它就表现出来了。我终于发现,已知的违规者是因为我的 NSManagedObjectContext 将其父上下文分配给了私有托管对象上下文。
注释掉具有我的主要上下文的代码行分配了一个私有父类,而是直接指向 NSPersistentStoreCoordinator 释放我的应用程序的所有内存泄漏。
我正在阅读以下文章:http://martiancraft.com/blog/2015/03/core-data-stack/,了解如何在我的应用程序中实现 CoreData 的设计模式。我真的很喜欢让专用队列专门用于写入磁盘,并在使用 UI 时将主上下文作为调用的单一来源。
所以我的问题是,有没有其他人遇到过这个问题,如果有的话,您是否知道解决方法,而不是仅仅在一个上下文中工作以避免内存泄漏?
下面是我的 CoreDataStack 中显示两个上下文变量的部分。
private lazy var privateManagedObjectContext: NSManagedObjectContext = {
let moc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
moc.persistentStoreCoordinator = self.persistentStoreCoordinator
return moc
}()
lazy var managedObjectContext: NSManagedObjectContext = {
let managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
// Commenting out #1 and unCommening #2 prevents the leak from happening
// However when the reverse happens and we create the private context, a memory leak occurs first thing in the app.
// #1
// managedObjectContext.parentContext = self.privateManagedObjectContext
// And instead replace it with this line
// #2
managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
return managedObjectContext
}()
这是我使用主要和私有托管对象上下文的保存方法的内容。
func save() {
guard managedObjectContext.hasChanges || privateManagedObjectContext.hasChanges else {
return
}
print("Going to save now")
managedObjectContext.performBlockAndWait() {
do {
try self.managedObjectContext.save()
} catch {
fatalError("Error saving main managed object context! \(error)")
}
}
privateManagedObjectContext.performBlock() {
do {
try self.privateManagedObjectContext.save()
} catch {
fatalError("Error saving private managed object context! \(error)")
}
}
}
【问题讨论】:
标签: ios swift core-data memory-leaks