我正在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对象没有告诉它这些是不同的实例。但是,我仍然无法弄清楚如何正确地做到这一点。
提前致谢!
答案 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"];
}