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 中 SKProduct 的 NSCoding 错误