我有一个来自OSX应用程序的项目文件,它是用NSKeyedArchiver生成的plist。我需要以编程方式更改其中的一个字符串。
基本上,它包含带有基础类的nsdictionary对象。但是有一个自定义类(gradientcolor)。我自己定义了它,并尝试在initwithcoder:和encodewithcoder:中不执行任何操作,但目标应用程序在尝试读取新生成的项目文件时崩溃。因此在初始化时无法正确处理nil值。
当使用initWithcoder:(nscoder*)adecoder初始化类时,我能知道哪些键对应于我的类以便将它们原封不动地重新编码吗?

最佳答案

我已经恢复了该类的实现(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/

10-04 10:23