【问题标题】:Swift NSObject subclass get BAD_ACCESSSwift NSObject 子类获取 BAD_ACCESS
【发布时间】:2014-11-12 14:54:52
【问题描述】:

我尝试使用 NSCoding 持久化我的对象,但我总是得到 BAD_ACCESS ERROR 为了避免多个变量,类,我将所有公共变量放在 RObject 中。我认为我在初始化时做错了,但我不知道是什么。

错误出现在此函数中

func parseInfo(allInfos : String) -> Void {

    if let all : JSON  = JSON.parse(allInfos) as JSON? {
        if let info = all.asArray
        {
            for description in info 
            {
                var track   : RInfo = SCTracks(js: description)
                self.arrayTracks.addObject(track)
            } // Therad 1: EXC_BAD_ACCESS(code=2, address=0x27...)
        }
    }
}

日志不显示任何内容

我的普通班

class RObject : NSObject, NSCoding {

    var id      : Int? = 0
    var kind    : String?

    override init() { super.init() }

      init(js :JSON) {
        self.kind               = js["kind"].asString
        self.id                 = js["id"].asInt
        super.init()
    }

    required
    init(coder aDecoder: NSCoder) {
        self.id = aDecoder.decodeIntegerForKey("id") as Int
        self.kind = aDecoder.decodeObjectForKey("kind") as? String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeInteger(self.id!, forKey: "id")
        aCoder.encodeObject(self.kind, forKey: "kind")
    }
}

继承自 RObject 的我的类 Rinfo

class RInfo : RObject  {

    var title               :String?
    var uri                 :String?
    var license             :String?
    var release             :String?
    var user                :RUser!

     override init() { super.init() }

    required  init(coder: NSCoder) {
        self.title          = coder.decodeObjectForKey("title") as? String
        self.user           = coder.decodeObjectForKey("user") as RUser
        self.license        = coder.decodeObjectForKey("license") as? String
        self.uri           = coder.decodeObjectForKey("uri") as? String
        self.release       = coder.decodeObjectForKey("release") as? String
        super.init(coder: coder)
    }


    init(js :JSON)  { 
        self.user               = js(js: js["user"])
        self.title              = js["title"].asString
        self.license            = js["license"].asString
        self.uri                = js["uri"].asString
        self.release            = js["release"].asString
        super.init(js: js)
    }

    override func encodeWithCoder(encoder: NSCoder) {
        encoder.encodeObject(self.title,            forKey: "title")
        encoder.encodeObject(self.user,             forKey: "user")
        encoder.encodeObject(self.uri,              forKey: "uri")
        encoder.encodeObject(self.license,          forKey: "license")
    }   
}

感谢您的帮助!

【问题讨论】:

  • 什么是崩溃日志 - 它提供了更多关于出现问题的信息。
  • 我看不出崩溃函数与给定代码的其余部分有何关联。
  • 我看到 RInfo.encodeWithCoder 没有调用 super.encodeWithCoder,但这也不能解释崩溃,或者为什么你认为它与 NSCoding RObject.init(coder:) 也有任何关系不调用 super。
  • 在我将 NSObject, NSCoding 设置为 RObject 之前,一切正常。当我可以实例化我的类 RInfo 时,问题就来了,我的初始化是错误的

标签: ios swift nsobject nscoding


【解决方案1】:

我通过删除 RInfo 中的变量 release 来解决我的问题。那个奇怪的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多