【问题标题】:EXC_BAD_ACCESS error for NSManagedObject implementing a protocol in SwiftNSManagedObject 在 Swift 中实现协议的 EXC_BAD_ACCESS 错误
【发布时间】:2014-09-12 05:36:05
【问题描述】:

我有以下两种方法:

func isAuthenticated() -> Bool {
    var currentUser: CurrentUser? = self.getCurrentUser()

    if currentUser == nil {
        return false
    }

    self.token = getUserToken(currentUser!.username)
    if self.token == nil {
        return false
    }

    if !tokenIsValidForUser(self.token!, user: currentUser!) {
        return false
    }

    return true
}

func tokenIsValidForUser(token: AuthenticationToken, user: UserObject) -> Bool {
    if token.username != user.username {
        return false
    }

    return true
}

当我调用 isAuthenticated() 时,它在 tokenIsValidForUser() 的第一行以 EXC_BAD_ACCESS 失败,显然是在 CurrentUser 对象上。

我的理解是当对象不再存在时会出现这种错误,但我不明白为什么会这样。

对象类型CurrentUser声明为:

protocol UserObject {
    var username: String { get set }
}

class CurrentUser: NSManagedObject, UserObject {

    @NSManaged var username: String

}

【问题讨论】:

  • 在调用方法“tokenIsValidForUser”之前,打印token和currentUser属性。我怀疑其中一个是 nil。
  • @JoJoe 他们都不是零。但是,有趣的是,如果我在任一对象上 println,例如println(currentUser!) 我得到一个空行。如果我println(currentUser!.username) 它将打印出用户名的值。
  • 嗯,我找不到你的代码有什么问题......也许是其他人。
  • 这个问题肯定与 currentUser 相关......现在我认为它可能与它是一个 NSManagedObject 有关。

标签: ios core-data swift protocols exc-bad-access


【解决方案1】:

我在这里找到了解决这个问题的方法:

http://lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/

本质上,这是 Swift 在 NSManaged 对象上实现协议时的一个怪癖。我必须在 CurrentUser 类中将 dynamic 关键字添加到我的 @NSManaged 属性中,以便该类看起来像这样:

class CurrentUser: NSManagedObject, UserObject {

    @NSManaged dynamic var username: String

}

【讨论】:

  • 知道为什么会这样吗?
  • 托管对象属性通常也在 obj-c 中动态管理。还记得使用动态而不是合成吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多