NSKeyedArchiver:区分同一类的不同实例

时间:2012-08-13 19:04:43

标签: cocoa osx-lion resume nsarchiving

我正在OS X应用程序中实现对Lion的“恢复”功能的支持。

我有一个NSViewController的自定义子类,我在其中实现了该方法 encodeRestorableStateWithCoder:as:

@implementation MyClass (Restoration)
    -(void)encodeRestorableStateWithCoder:(NSCoder*)coder {
       [coder encodeObject:_dataMember forKey:@"object_key"]; // I get the warning below when this line is executed for the second time
    }
    - (void)restoreStateWithCoder:(NSCoder *)coder {
       _dataMember = [coder decodeObjectForKey:@"object_key"];
    }
@end

但是,由于我有多个MyClass实例,不同的值保存在同一个键(“object_key”)中,我从Cocoa收到以下警告:

  

NSKeyedArchiver警告:替换密钥的现有值   'object_key';类层次结构中可能的重复编码键

克服此问题的最佳做法是什么?

编辑:我发现here每个实例都自动拥有自己的命名空间以避免冲突,所以问题可能在于我手动调用encodeRestorableStateWithCoder到不同的实例相同的NSCoder对象没有告诉它这些是不同的实例。但是,我仍然无法弄清楚如何正确地做到这一点。

提前致谢!

1 个答案:

答案 0 :(得分:1)

为了解决这个问题,可以创建一个新的NSMutableData,其中每个NSMutableData都由单独的(新)NSKeyArchiver编写,并将它们全部存储在一个存储在原始数组中的数组中NSCoder对象。

以下是编码子项目的可恢复状态的示例。鉴于此代码,解码部分可以是直接的。

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
    [super encodeRestorableStateWithCoder:coder];

    // Encode subitems states:
    NSArray* subitems = self.items;
    NSMutableArray* states = [NSMutableArray arrayWithCapacity: subitems.count];
    for (SubItemClass* item in subitems)
    {
        NSMutableData* state = [NSMutableData data];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:state];
        [item encodeRestorableStateWithCoder:archiver];
        [archiver finishEncoding];
        [states addObject:state];
    }
    [coder encodeObject:states forKey:@"subitems"];
}