我有一个扩展的自定义类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
NSString 是一个类簇 http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html:
“NSString 是一个类簇,还有其他 Foundation 类型,例如 NSNumber 和 NSArray:
类集群是 Foundation 框架广泛使用的一种设计模式。类簇将许多私有的、具体的子类分组到一个公共的、抽象的超类下。以这种方式对类进行分组简化了面向对象框架的公开可见的体系结构,而不会降低其功能的丰富性。类集群基于“Cocoa 设计模式”中讨论的抽象工厂设计模式。”
确保您阅读了“子类化注释”NSString 文档 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html...您必须为您的子类实现自定义存储机制。我的猜测是你没有这样做,或者如果你这样做了,当你调用 NSCoding 方法时,你仍然会看到那些私有类弹出super
, 因为super
将使用具体的方法私人课程NSString 引用的内容(取决于其内容)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)