gpt4 book ai didi

ios - 由于 PrivateQueueConcurrencyType 导致 CoreData 内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:36 25 4
gpt4 key购买 nike

我今天发现了一个内存泄漏,当从我的 ma​​in NSManagedObjectContext 调用 executeFetchRequest 时,它就表现出来了。我终于发现已知的违规者是因为我的 NSManagedObjectContext 将其父上下文分配给私有(private)托管对象上下文。

注释掉让我的主上下文分配一个私有(private)父类的代码行,而不是直接指向 NSPersistentStoreCoordinator 释放我的应用程序的所有内存泄漏。

我正在阅读以下文章:http://martiancraft.com/blog/2015/03/core-data-stack/有关如何在我的应用程序中实现 CoreData 的设计模式。我真的很喜欢让私有(private)队列专用于写入磁盘,并在使用 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
}()

这是我使用主和私有(private)托管对象上下文的保存方法。

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)")
}
}

}

最佳答案

private lazy var privateManagedObjectContext: NSManagedObjectContext = {
let moc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
moc.parent = managedObjectContext // Set the receiver’s parent context
return moc
}()

也许这会解决问题。

关于ios - 由于 PrivateQueueConcurrencyType 导致 CoreData 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com