【发布时间】:2013-06-05 09:13:07
【问题描述】:
有什么方法可以使用NSKeyedArchiver 对包含自定义结构的NSValue 进行编码?我有一个NSDictionary,其中包含包装在NSValues 中的结构,我想将其存档为更大对象图的一部分,但我收到以下错误:
-[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs
但是,请考虑以下事项:
//Copy of the CGPoint declaration
struct MYPoint {
CGFloat x;
CGFloat y;
};
typedef struct MYPoint MYPoint;
CGPoint point = {1.0, 1.0};
MYPoint myPoint = {1.0, 1.0};
NSLog(@"CGPoint: %s", @encode(CGPoint)); //CGPoint: {CGPoint=ff}
NSLog(@"MYPoint: %s", @encode(MYPoint)); //MYPoint: {MYPoint=ff}
NSValue *CGPointValue = [NSValue valueWithBytes:&point objCType:@encode(CGPoint)];
NSData *CGPointData = [NSKeyedArchiver archivedDataWithRootObject:CGPointValue];
//NO ERROR
NSValue *MYPointValue = [NSValue valueWithBytes:&myPoint objCType:@encode(MYPoint)];
NSData *MYPointData = [NSKeyedArchiver archivedDataWithRootObject:MYPointValue];
//ERROR: -[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs
仅仅是“这个归档器不能编码你的结构”这就是故事的结尾还是有可能得到与@987654327相同的行为@ 但对于自定义结构?
我可能会创建一个小的自定义对象,它包装一个 NSValue 并实现 NSCoding 来解决它,但我很好奇上面代码中显示的与 CGPoint 的矛盾,并想知道是否存在扩展 NSValue 以获得相同行为的方法。
【问题讨论】:
标签: objective-c cocoa nskeyedarchiver nscoding nsvalue