更新到XCode 9后,Wierd NSKeyedArchiver的行为

时间:2017-10-04 11:12:43

标签: ios swift nskeyedarchiver nscoder

我有一个与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时,问题就消失了。感谢您的评论

0 个答案:

没有答案