如何在目标C中对类型对象进行编码和解码?

时间:2017-11-01 13:37:23

标签: ios objective-c decode encode nscoder

我有这个对象:

@interface EasySortDevices : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *iconName;
@property (nonatomic) Class deviceObject;

@end

如何编码和解码Class属性deviceObject

PS:它无法使用:

- (void)encodeWithCoder:(NSCoder *)aCoder {

     [aCoder encodeObject:self.name forKey:@"name"];
     [aCoder encodeObject:self.iconName forKey:@"iconName"];
     [aCoder encodeObject:self.deviceObject forKey:@"deviceObject"];
}

2 个答案:

答案 0 :(得分:1)

deviceObject应该支持NSCoding。因此,要编码自定义对象,您必须为其提供编码和解码方法。
P.S 你编写的编码方法很好,它只需要deviceObject来实现编码和解码。

答案 1 :(得分:0)

限制编码员支持

关注此苹果链接: - https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html

在某些情况下,类可以实现NSCoding协议,但不支持一种或多种编码器类型。例如,类NSDistantObject,NSInvocation,NSPort及其子类仅采用NSCoding供NSPortCoder在分布式对象系统中使用;它们无法编码到存档中。在这些情况下,类可以测试编码器是否属于特定类型,如果不支持则引发异常。如果限制只是将类限制为顺序存档或键控存档,则可以将消息allowKeyedCoding发送给编码器;否则,你可以测试编码器的类身份。

或者,如果您使用 NSSecureCoding Protocol

进行对象编码和解码

NSCoding是一种非常简单方便的方法,可以将模型对象直接转换为文件,然后再将其加载回内存,而无需编写任何文件解析和序列化逻辑,从而在iOS或Mac OS上存储数据。要将任何对象保存到数据文件(假设它实现了NSCoding协议),您可以这样做:

Class * deviceObject = [[Class alloc] init];
[NSKeyedArchiver archiveRootObject:deviceObject toFile:deviceObject];

稍后再加载它:

Class *deviceObject = [NSKeyedUnarchiver unarchiveObjectWithFile:deviceObject];