使用NSKeyedArchiver解码然后编码未知类?

时间:2013-08-22 19:10:53

标签: objective-c nskeyedarchiver nskeyedunarchiver

我从OS X应用程序获得了一个项目文件,该文件是使用NSKeyedArchiver生成的plist。我需要以编程方式更改其中的一个字符串。

基本上,它包含带有Foundation类的NSDictionary对象。但是有一个自定义类(GradientColor)。我自己定义并尝试在initWithCoder中执行任何操作:和encodeWithCoder:但目标应用程序崩溃尝试读取新生成的项目文件。因此初始化时无法正确处理nil值。

在使用initWithCoder初始化时,我能以某种方式知道哪些键对应于我的类:(NSCoder *)aDecoder,以便将它们编码为不变?

1 个答案:

答案 0 :(得分:1)

我已经恢复了该类的实现(GradientColor)。实际上,它存储了非常少量的数据:

@interface GradientColor : NSView <NSCoding> {
    float location;
    NSColor *color;
}
@end

@implementation GradientColor
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeFloat:location forKey:@"location"];
    [aCoder encodeObject:color forKey:@"color"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        location = [aDecoder decodeFloatForKey:@"location"];
        color = [aDecoder decodeObjectForKey:@"color"];
    }
    return self;
}
@end

我的版本什么也没做,但是作为原始实现正确地序列化和反序列化。我在plist中看到了所需的键和它们的类型。现在我的CLI工具生成有效的项目文件。

在这里,我发现了一篇关于NSKeyedArchive内部结构的好帖子,它给了我很多帮助:http://digitalinvestigation.wordpress.com/2012/04/04/geek-post-nskeyedarchiver-files-what-are-they-and-how-can-i-use-them/