gpt4 book ai didi

cocoa - NSKeyedArchiver : distinguishing between different instances of the same class

转载 作者:行者123 更新时间:2023-12-03 16:43:01 26 4
gpt4 key购买 nike

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

我有一个 NSViewController 的自定义子类,我在其中实现了该方法编码RestorableStateWithCoder:如:

@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 warning: replacing existing value for key 'object_key'; probable duplication of encoding keys in class hierarchy

解决这个问题的最佳实践是什么?

编辑:我发现 here每个实例都会自动拥有自己的命名空间以避免冲突,因此问题可能出在我手动调用encodeRestorableStateWithCoder 到具有相同 NSCoder 对象的不同实例而不告诉它这些是不同实例的方式。但是,我仍然不知道如何正确地做到这一点。

提前致谢!

最佳答案

为了克服这个问题,可以创建一个新的 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"];
}

关于cocoa - NSKeyedArchiver : distinguishing between different instances of the same class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11940646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com