我有一个与Xcode 8完美配合的应用程序。现在我正在准备一些小的更新并遇到NSKeyedArchiver
的意外行为。在更新到Xcode 9之前没有问题的代码下面:
func saveChecklist(_ checklist : [SingleSection], name: String){
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true)
let path: AnyObject = paths[0] as AnyObject
let fileName = "/" + name + ".qad"
let arrPath = path.appending(fileName)
NSKeyedArchiver.setClassName("SingleSection", for: SingleSection.self)
NSKeyedArchiver.archiveRootObject(checklist, toFile: arrPath)
}
现在最后一行引发崩溃并显示错误消息:
libc ++ abi.dylib:以未捕获的类型异常终止 NSException
我根本没有更改这部分代码,我也不知道发生了什么。我相信问题的根源在于类定义,但在更新之前,一切都很好。下面是一个类定义:
class SingleSection: NSCoder {
var sectionName: String
var itemsInSection: [String]
var isChecked: [Bool]
var itemsComment: [String]
var finding: [Int]!
var images: [[String]]!
var videos: [[String]]!
override init() {
sectionName = ""
itemsInSection = []
isChecked = []
itemsComment = []
finding = []
images = []
videos = []
}
init (coder aDecoder: NSCoder!){
self.sectionName = (aDecoder.decodeObject(forKey: "sectionName") as? String)!
self.itemsInSection = (aDecoder.decodeObject(forKey: "itemsInSection") as? [String])!
self.isChecked = (aDecoder.decodeObject(forKey: "isChecked") as? [Bool])!
self.itemsComment = (aDecoder.decodeObject(forKey: "itemsComment") as? [String])!
self.finding = aDecoder.decodeObject(forKey: "finding") as? [Int]
self.images = aDecoder.decodeObject(forKey: "images") as? [[String]]
self.videos = aDecoder.decodeObject(forKey: "videos") as? [[String]]
}
func encodeWithCoder(_ aCoder: NSCoder!){
aCoder.encode(sectionName, forKey: "sectionName")
aCoder.encode(itemsInSection, forKey: "itemsInSection")
aCoder.encode(isChecked, forKey: "isChecked")
aCoder.encode(itemsComment, forKey: "itemsComment")
aCoder.encode(finding!, forKey: "finding")
aCoder.encode(images!, forKey: "images")
aCoder.encode(videos!, forKey: "videos")
}
}
主要问题是更新后出现的问题以及解决方法。任何帮助表示赞赏。
更新:当我采用NSCoding
时,问题就消失了。感谢您的评论