Swift 的 NSCoding 中的 EXC_BAD_INSTRUCTION

Posted

技术标签:

【中文标题】Swift 的 NSCoding 中的 EXC_BAD_INSTRUCTION【英文标题】:EXC_BAD_INSTRUCTION in NSCoding of Swift 【发布时间】:2014-06-05 03:03:30 【问题描述】:
    func encodeWithCoder(aCoder: NSCoder!)
        aCoder.encodeObject(title.bridgeToObjectiveC(), forKey: "title")
        aCoder.encodeObject(self.artist.bridgeToObjectiveC(), forKey: "artist")
    

    init(coder aDecoder: NSCoder!) 
        NSLog("title: %@", aDecoder.decodeObjectForKey("title") as NSString); //<---|Causes crash here but still logs the title
        self.title = String.bridgeFromObjectiveC(aDecoder.decodeObjectForKey("title") as NSString)
    

我有一个符合上述 NSCoding 的 NSObject,但是当它初始化和解码调用 decodeObjectForKey 并使用 EXC_BAD_INSTRUCTION 停止代码时

【问题讨论】:

你为什么使用NSLog而不是println?您应该在 Swift 中使用 println 作为日志记录语句,没有真正的理由使用 NSLog @lxt 抱歉,这是出于习惯。在我的代码中替换它并没有解决问题 @ixt 确实有理由使用NSLog 而不是println,NSLog 为消息添加时间戳 也许您的密钥也需要桥接到目标 c?很遗憾,我们没有真正的 swift 框架、库或模式。 【参考方案1】:

仔细检查您是从 NSObject 继承的。事实证明,如果你想做基础性的事情,你确实需要一个超类。反正这是我的问题。

【讨论】:

感谢您的回答,但它已经class PlayerItem: NSObject, NSCoding【参考方案2】:

尝试在没有桥接调用的情况下执行此操作。它仍然应该无缝连接到 NSString。

【讨论】:

是的,当我这样做时,它实际上再次调用了 EXC BAD ACCESS【参考方案3】:

也许你可以试试这个。

import Foundation

class AnyClass:NSObject, NSCoding

    var title : String
    var artist : String

    init() 
        self.title = "TitleName"
        self.artist = "ArtistName"
    

    init(coder aDecoder: NSCoder!)         
        title = aDecoder.decodeObjectForKey("title") as String
        artist = aDecoder.decodeObjectForKey("artist") as String

        println(title)
    


    func encodeWithCoder(_aCoder: NSCoder!)
        _aCoder.encodeObject(self.title, forKey: "title")
        _aCoder.encodeObject(self.artist, forKey: "artist")

    

【讨论】:

尝试使用 String 而不是 NSString。【参考方案4】:

下面是我在阅读位于Mac Developer site 或ios Developer site 的文档后构建的工作示例(作为命令行实用程序)。注意:我是从 Objective-C 转换过来的,因为那是我链接到的 PDF 中的内容。

正如上面的比尔所说,应该没有必要做桥接。

import Foundation

class Gloppo2 : NSObject, NSCoding 
    var Dorf2:String = ""
    var Druben2:String = ""

    func encodeWithCoder(aCoder: NSCoder!) 
        aCoder.encodeObject(self.Dorf2, forKey: "Dorf2")
        aCoder.encodeObject(self.Druben2, forKey: "Druben2")
    

    init(coder aDecoder: NSCoder!) 
        Dorf2 = aDecoder.decodeObjectForKey("Dorf2") as NSString!
        Druben2 = aDecoder.decodeObjectForKey("Druben2") as NSString!
    

    init() 

    


var newGloppo = Gloppo2()
newGloppo.Dorf2 = "Sue"
newGloppo.Druben2 = "Perman"

NSKeyedArchiver.archiveRootObject(newGloppo, toFile: "gloppo2.bin")

var newGloppo2 = NSKeyedUnarchiver.unarchiveObjectWithFile("gloppo2.bin") as Gloppo2

println(newGloppo2.Dorf2)
println(newGloppo2.Druben2)

【讨论】:

以上是关于Swift 的 NSCoding 中的 EXC_BAD_INSTRUCTION的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 的 NSCoding 初始化中返回预先存在的核心数据对象?

Swift,NSCoding 保存类的数组不起作用

Swift 中 SKProduct 的 NSCoding 错误

NSCoding 在 Swift 的继承类中需要初始化器

Swift 和 NSCoding:对符合类协议的对象数组进行编码

Swift 继承遵循nscoding的oc类怎么解决require