使用 NSCoder 编码数组

Encode Array with NSCoder

我有一个用户 Class,只要应用程序终止,它就会使用 saveuser() 方法。用户有两个 Arrays 的自定义 Classes,子 class NSObject。这是我的编码方法。

func encode(with aCoder: NSCoder) {
    aCoder.encode(self.firstName, forKey: coderKey.fName)
    aCoder.encode(self.lastName, forKey: coderKey.lName)
    aCoder.encode(self.bio, forKey: coderKey.bio)
    aCoder.encode(self.tags, forKey: coderKey.tags)
    aCoder.encode(self.organizations, forKey: coderKey.orgs)
    aCoder.encode(self.img, forKey: coderKey.img)
}

应用程序在编码时崩溃 self.tags。我认为它会对 self.organizations 做同样的事情,因为它也是 NSObjectsarray,并且可能对 self.img 做同样的事情,因为它是 UIImage。这是我收到的错误。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Social_Justice.Tag encodeWithCoder:]: unrecognized selector sent to instance 0x60000005efc0'

我应该怎么做才能解决这个问题?如果您需要查看更多代码,请发表评论,我会进行编辑。

正如 David Berry 对原文的评论 post。您必须确保您尝试编码的任何自定义 类 也符合 NSCoder。他们不需要有存档路径,他们只需要有编码和解码功能。

答案:

  1. 我假设class数组中对象的名称self.tags和self.organizations标签组织

  2. Objective-C 使用非常不同的函数调用风格。如果你看到 [ClassName/ObjectName methodName] 在某种程度上等同于 Swift 中的 ObjectName.function() 风格,我们暂时这样说(Swift 编译器将来会更好,希望您在调试时不会再看到 objctive-C 警告)

  3. 一个selector是Objective-C使用的术语,你可以认为这是一种方法。因此,这个无法识别的选择器错误警告告诉您代码试图调用一个名为 encodeWithCode() 的方法,该方法实际上并不存在于对象 TagOrganization(NSCoder系统知道如何编码一个数组,但不知道如何编码你自己的数组内部对象)

  4. 如果你想在对象上使用NSCoder系统的5个具体classes,对象必须符合NSCoding 协议。这意味着 class(TagOrganization)必须实现 init?(coder: NSCoder)func encode(with: NSCoder)

  5. NSCoder的4个具体class是NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.

进一步阅读:

NSCoding / NSKeyed​Archiver By NSHipster

或者:(我最喜欢的)

Apple Document NSCoder

Apple Document NSKeyedArchiver

Apple Document NSCoding

或者:(如果那些文档对你来说还是有点混淆)

Hollemans M. 2016,iOS 学徒第五版教程 2 检查表,第 126 页 ~ 第 137 页