gpt4 book ai didi

objective-c - NSKeyedArchiver 返回意外类?

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:19 25 4
gpt4 key购买 nike

我有一个扩展 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 是一个 class cluster :

“NSString 是一个类簇,还有其他基础类型,如 NSNumber 和 NSArray:

类集群是 Foundation 框架广泛使用的一种设计模式。类簇将许多私有(private)的、具体的子类分组在一个公共(public)的、抽象的父类(super class)下。以这种方式对类进行分组简化了面向对象框架的公开可见架构,而没有减少其功能丰富性。类集群基于“Cocoa 设计模式”中讨论的抽象工厂设计模式。”

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

关于objective-c - NSKeyedArchiver 返回意外类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781248/

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