2

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

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

@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”的现有值;类层次结构中的编码键可能重复

克服这个问题的最佳实践是什么?

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

提前致谢!

4

1 回答 1

1

为了克服这个问题,可以创建一个新的 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"];
}
于 2012-08-23T05:38:38.583 回答