简单的 macOs 应用程序获取 EXC_BAD_ACCESS 用于 CoreData 访问一对多对象
Simple macOs app gets EXC_BAD_ACCESS for CoreData accessing one to many object
我有一个非常简单的应用程序,它有一个 CoreData 数据库,其中有两种类型的对象,一种是主要对象,另一种。主对象,对象A,可以有多个对象B。但是对象B,只能连接到一个对象A。
我的问题是,应用 运行 一段时间后,它遇到了 EXC_BAD_ACCESS
错误。
准确地说:
Thread 85: EXC_BAD_ACCESS (code=1, address=0x77e341213c20)
我做了一些调试,看起来只有当我打开界面的 SwiftUI 部分并可能对数据库进行更改时才会发生这种情况。我在论坛上读到,这是一个线程问题和访问。我尝试了那里提到的数据库设置(我在这里复制),但仍然遇到错误。
struct PersistenceController {
static let shared = PersistenceController()
static var preview: PersistenceController = {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
return result
}()
var context: NSManagedObjectContext {
return container.viewContext
}
var container: NSPersistentContainer
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "MyApp")
// turn on persistent history tracking
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
container.newBackgroundContext()
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: {(storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
}
}
我的问题是,我该如何调试它?我明白这个事实,这是试图访问已经发布的对象 B 的数组,我只是不明白为什么要发布它。难道是因为我打开了SwiftUiwindow又关闭了?但是为什么连接不保持呢?
有什么办法可以避免这个错误吗?当抛出异常时,我可以在调试器中看到 3 个线程 运行,但我不知道“创建新线程”并且是 Swift 的新手,不知道如何启动一个线程,或阻止创建一个。
除了将上下文直接向下传递到视图之外,我在两个地方使用了如下所示的助手:
public func getManagedContext() -> NSManagedObjectContext {
return (NSApplication.shared.delegate as! AppDelegate).coreDataStack.context
}
您可以尝试在 DipatchQueue.main 块中获取值
它将避免阻塞当前线程。
我有一个非常简单的应用程序,它有一个 CoreData 数据库,其中有两种类型的对象,一种是主要对象,另一种。主对象,对象A,可以有多个对象B。但是对象B,只能连接到一个对象A。
我的问题是,应用 运行 一段时间后,它遇到了 EXC_BAD_ACCESS
错误。
准确地说:
Thread 85: EXC_BAD_ACCESS (code=1, address=0x77e341213c20)
我做了一些调试,看起来只有当我打开界面的 SwiftUI 部分并可能对数据库进行更改时才会发生这种情况。我在论坛上读到,这是一个线程问题和访问。我尝试了那里提到的数据库设置(我在这里复制),但仍然遇到错误。
struct PersistenceController {
static let shared = PersistenceController()
static var preview: PersistenceController = {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
return result
}()
var context: NSManagedObjectContext {
return container.viewContext
}
var container: NSPersistentContainer
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "MyApp")
// turn on persistent history tracking
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
container.newBackgroundContext()
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: {(storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
}
}
我的问题是,我该如何调试它?我明白这个事实,这是试图访问已经发布的对象 B 的数组,我只是不明白为什么要发布它。难道是因为我打开了SwiftUiwindow又关闭了?但是为什么连接不保持呢?
有什么办法可以避免这个错误吗?当抛出异常时,我可以在调试器中看到 3 个线程 运行,但我不知道“创建新线程”并且是 Swift 的新手,不知道如何启动一个线程,或阻止创建一个。
除了将上下文直接向下传递到视图之外,我在两个地方使用了如下所示的助手:
public func getManagedContext() -> NSManagedObjectContext {
return (NSApplication.shared.delegate as! AppDelegate).coreDataStack.context
}
您可以尝试在 DipatchQueue.main 块中获取值 它将避免阻塞当前线程。