Swift 在访问 NSManagedObject 的属性时给出错误线程 1:EXC_BAD_ACCESS(code=1, address=0x0)

Posted

技术标签:

【中文标题】Swift 在访问 NSManagedObject 的属性时给出错误线程 1:EXC_BAD_ACCESS(code=1, address=0x0)【英文标题】:Swift Gives error Thread 1: EXC_BAD_ACCESS(code=1, address=0x0) when accessing NSManagedObject's property 【发布时间】:2015-01-22 15:47:27 【问题描述】:

我创建 NSManagedObject 的子类对象的函数是;

func loginMoldelWithName(name: NSString, atIndexPath indexPath: NSIndexPath) -> LoginModel 

    let entity = NSEntityDescription.entityForName("LoginModel", inManagedObjectContext: managedObjectContext!)

    var login = LoginModel(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

    login.name = name
    login.date = NSDate()
    login.rowIndex = indexPath.row as NSNumber

    var error: NSError?
    if !managedObjectContext!.save(&error) 
        println("\(TAG) Could not save \(error), \(error?.userInfo)")
    

    return login as LoginModel 

还有要删除的;

func deleteLoginModel(loginModel: LoginModel) 
    println("\(TAG)  \(loginModel.name)")
    managedObjectContext?.deleteObject(loginModel)

    var error : NSError?
    if(managedObjectContext!.save(&error) ) 
        println("\(TAG) \(error?.localizedDescription)")
    

问题出在哪里;

let loginModel = loginModels[indexPath.row] as LoginModel
println("\(TAG) \(loginModel.name)")
// remove from Core Data
deleteLoginModel(loginModel)
...

当我尝试访问 loginModel.name 时删除 loginModel 对象后,我收到错误“线程 1:EXC_BAD_ACCESS(code=1, address=0x0)”

在变量视图中为 loginModel 写入了无效的表达式,请参见下面的 snaphsot...

我找不到我做错了什么以及 loginModel 实例可能发生了什么?

【问题讨论】:

【参考方案1】:

从您附加的屏幕截图来看,似乎发生了错误,因为您试图在该对象被删除之后访问该对象的属性。此时,对象的属性将不再是有效的内存地址。

【讨论】:

loginModel 是保存在 loginModels 数组中的变量...“让 loginModel = loginModels[indexPath.row] as LoginModel” 我认为我只是删除了核心数据中的数据,而不是从数组中删除。当我在删除后打印数组的内容时,它会打印具有相关内存地址的 LoginModel 对象,例如“loginModels [3] (PasswordLockerSwift.LoginModel) 0x00007f92d9d4bc60 0x00007f92d9d4bc60”。但是我无法访问它的 name 属性。 因为还在数组中,所以loginModel实例还是有内存地址的。但是,由于底层 Core Data 对象已被删除,所有对象的属性现在都无效了。 如何检查coredata对象的实例是否无效?

以上是关于Swift 在访问 NSManagedObject 的属性时给出错误线程 1:EXC_BAD_ACCESS(code=1, address=0x0)的主要内容,如果未能解决你的问题,请参考以下文章

Swift 在访问 NSManagedObject 的属性时给出错误线程 1:EXC_BAD_ACCESS(code=1, address=0x0)

Swift Core Data - 使用 NSManagedObject 子类访问获取的实体时出错

无法通过 Swift 扩展向objective-c NSManagedObject 子类添加方法

SWIFT CoreData NSManagedObject

NSManagedObject 上的 Swift 扩展

在 Swift 中将存储属性添加到 NSManagedObject 的子类