【问题标题】:NSKeyedArchiver returning unexpected class?NSKeyedArchiver 返回意外的类?
【发布时间】:2011-10-15 23:05:09
【问题描述】:

我有一个扩展 NSString 的自定义类。我正在尝试使用NSKeyedArchiver 对其进行序列化(用于拖放)。该类覆盖了...Coder 方法:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        data = [[aDecoder decodeObjectForKey:@"data"] copy];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:self.data forKey:@"data"];
}

但是当我尝试实际运行归档/取消归档时:

MyClass *object = [[MyClass alloc] init];
[pboard setData:[NSKeyedArchiver archivedDataWithRootObject:object] forType:SACP_WRAPPER_DRAG_TYPE];
NSLog(@"Wrote data for class %@", [object class]);

...

id item = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:SACP_WRAPPER_DRAG_TYPE]];
NSLog(@"Read data for class %@", [item class]);

输出不是我所期望的:

2011-10-15 18:56:22.898 MyApp[7402:707] Wrote data for class ASCIIString
2011-10-15 18:56:23.345 MyApp[7402:707] Read data for class __NSCFString

【问题讨论】:

    标签: objective-c cocoa nsstring nscoding


    【解决方案1】:

    NSString 是一个class cluster:

    "NSString 是一个类簇,以及其他 Foundation 类型,例如 NSNumber 和 NSArray:

    类集群是 Foundation 框架广泛使用的一种设计模式。类簇将许多私有的具体子类组合在一个公共的抽象超类之下。以这种方式对类进行分组简化了面向对象框架的公开可见架构,而不会降低其功能丰富性。类簇基于“Cocoa 设计模式”中讨论的抽象工厂设计模式。”

    确保您阅读了NSString doc...中的“子类化注释”...您必须为您的子类实现自定义存储机制。我的猜测是你没有这样做,或者如果你这样做了,当你在 super 上调用 NSCoding 方法时,你仍然会看到那些私有类弹出,因为 super 将使用特定 的方法NSString 引用的私有类(取决于其内容)。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2020-06-24
      • 2012-12-28
      • 2014-10-07
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多