当原始类不可用时如何解码对象?

2023-12-29

我有一个 iOS 7 应用程序,它将自定义对象作为文件保存到应用程序的 iCloud Docs 文件夹中。为此,我使用 NSCoding 协议。

@interface Person : NSObject <NSCoding>

    @property (copy, nonatomic) NSString *name
    @property (copy, nonatomic) NSString *lastName

@end

对象序列化在 iOS 7 版本的应用程序中完美运行:

  1. initWithCoder and encodeWithCoder

  2. [NSKeyedArchiver archivedDataWithRootObject:person]

  3. person = NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)theData]

但我需要将此应用程序移至 iOS 8,并且此类将使用 swift 进行编码,并针对该应用程序的新 iOS 8 版本进行“重命名”。

class PersonOldVersion: NSObject, NSCoding {
    var name = ""
    var lastName = ""
}

当我尝试取消归档对象时,出现以下错误:

*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Person)'

我已经尝试将 swift 类“PersonOldVersion”重命名为原始类名(“Person”),但仍然失败。

如何解码原始类不可用的对象?


这可能是另一种解决方案,这就是我所做的(因为当时我没有使用 Swift)。

就我而言,我归档了“City”类的对象,但随后将该类重命名为“CityLegacy”,因为我创建了一个全新的“City”类。

我必须这样做才能将旧的“City”对象取消归档为“CityLegacy”对象:

// Tell the NSKeyedUnarchiver that the class has been renamed
[NSKeyedUnarchiver setClass:[CityLegacy class] forClassName:@"City"];

// Unarchive the object as usual
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"city"];
CityLegacy *city = [NSKeyedUnarchiver unarchiveObjectWithData:data];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当原始类不可用时如何解码对象? 的相关文章

随机推荐