NSKeyedUnarchiverdecodeObjectForKey:无法解码密钥类的对象(NS.objects)

2024-01-01

我浏览了整个SO,但仍然没有答案。我的应用程序报告此问题:

致命异常:NSInvalidUnarchiveOperationException *** -[NSKeyedUnarchiverdecodeObjectForKey:]: 无法解码密钥 (NS.objects) 类 (App_Title.Products) 的对象;这 类可以在源代码或未链接的库中定义

我已经在 #unarchiveObject 之前做了 NSKeyedUnarchiver.setClass :

func loadProducts() -> [Products]? {
    NSKeyedUnarchiver.setClass(Products.self, forClassName: "Products")
    let unarchivedData = NSKeyedUnarchiver.unarchiveObject(withFile: Products.ArchiveURL.path)

我的产品类以 @Objc 开头:

import Foundation

@objc(Products)
class Products: NSObject, Codable, NSCoding { ... }

添加上面的两行似乎对人们有帮助并没有给我带来任何运气。在他们之前和之后都是同样的行为。我个人永远无法自己重现这个问题。

在开发过程中,我非常密切地关注应用程序指南坚持 https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/PersistData.html并多次审阅。

就在 NSKeyedArchiver 之前,我检查文件是否存在:

let filePath = Products.ArchiveURL.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) {

这里有一些屏幕截图中的附加信息。

我唯一能找到真正的异常描述的地方是 Firebase Crashlytics:

Xcode Organizer 的 Crash 选项卡下的屏幕截图:

这导致了代码中的这一行:

NSKeyedUnarchiver.setClass(Products.self, forClassName: "Products")
let unarchivedData = NSKeyedUnarchiver.unarchiveObject(withFile: Products.ArchiveURL.path)

带有 @Objc 注释的产品类。


看来你混淆了Codable and NSCoding。不要尝试同时使用两者。NSKeyedUnarchiver属于NSCoding.

您的类包含符合属性列表的属性。降低NSCoding并仅使用Codable。 (顺便说一句,建议以单数形式命名类Product).

删除所有相关的内容NSCoding包括协议一致性和Codable该类不必继承自NSObject(该对象甚至可以是一个结构)。

The loadProducts函数可以简化为

func loadProducts() throws -> [Product] {
    let data = try Data(contentsOf: Product.ArchiveURL)
    return try PropertyListDecoder().decode([Product].self, from: data)
}

移交是个好习惯thrown给调用者带来错误

并删除CodingKeys,如果键与属性名称匹配,则不需要它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSKeyedUnarchiverdecodeObjectForKey:无法解码密钥类的对象(NS.objects) 的相关文章

随机推荐