有什么办法可以使用NSKeyedArchiver
来编码包含自定义结构的NSValue
?.我有一个NSDictionary
包含结构包裹在NSValues
我要存档这是一种大型的对象图的一部分,但我收到以下错误:NSKeyedArchiver:如何归档包含自定义结构的NSValue
-[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
“这个存档器不能编码你的结构”是这样的情况,这是故事的结局还是有可能获得相同的行为,但为定制结构可以得到CGPoint
?
我将只创建一个包装了NSValue
并实现NSCoding
解决它一个小的自定义对象,但我很好奇在代码CGPoint
和奇迹上面显示的矛盾如果有NSValue延伸到路得到相同的行为。
感谢您的回答。替代的结构定义不能解决错误。关心使用'NSData'替代'NSValue'来封装结构。你知道他们是否有任何可移植性考虑?归档数据最终可能通过iCloud/Game Center在设备(OSX和iOS)之间移动。 –
是的,可能存在处理器之间的可移植性问题,具有不同的排列顺序...... – Wain