NSKeyedArchiver返回意外的课程?

Cra*_*tis 4 cocoa objective-c nscoding nsstring

我有一个扩展的自定义类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"];
}
Run Code Online (Sandbox Code Playgroud)

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

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]);
Run Code Online (Sandbox Code Playgroud)

输出不是我所期望的:

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
Run Code Online (Sandbox Code Playgroud)

Nic*_*k B 5

NSString是一个类集群:

"NSString是一个类集群,以及其他基础类型,如NSNumber和NSArray:

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

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