【问题标题】:NSKeyedArchiver: distinguishing between different instances of the same classNSKeyedArchiver:区分同一类的不同实例
【发布时间】:2012-08-13 19:04:42
【问题描述】:

我正在我的 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 的不同实例对象而不告诉它这些是不同的实例。但是,我仍然无法弄清楚如何正确地做到这一点。

提前致谢!

【问题讨论】:

    标签: cocoa osx-lion resume nsarchiving


    【解决方案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"];
    }
    

    【讨论】:

    • 但这不适用于编码NSViewController 实例,不是吗?
    • 我认为它应该适用于NSViewController,为什么不呢?
    • @benuri Here's why.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多