objective-c - NSKeyedArchiver:如何归档包含自定义结构的 NSValue

标签 objective-c cocoa nskeyedarchiver nscoding nsvalue

有什么方法可以使用 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

这只是“这个存档器无法编码您的结构”的情况吗?这就是故事的结局,还是有可能获得与相同的行为>CGPoint 但对于自定义结构?

我可能只会创建一个小的自定义对象来包装 NSValue 并实现 NSCoding 来解决它,但我对上面代码中显示的矛盾感到好奇与 CGPoint 并想知道是否有办法扩展 NSValue 以获得相同的行为。

最佳答案

@encode 和匿名结构有关的问题存在。尝试将结构定义更改为:

typedef struct MYPoint { 
    CGFloat x;
    CGFloat y;
} MYPoint;

如果这不起作用,您可以使用 NSData 包装该结构:

[NSData dataWithBytes:&myPoint length:sizeof(MYPoint)];

关于objective-c - NSKeyedArchiver:如何归档包含自定义结构的 NSValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935937/

相关文章:

iphone - 在 Objective C 中将数据发布到 Wufoo 表单

ios - 使用 NSCoding 归档 UIImageView

ios - 未调用自定义 NSObject iniWithCoder

objective-c - 压缩代码有什么好处吗?

ios - 比较 Objective C 中的 NSString

objective-c - NSPredicate谓词WithFormat : variable substitution

ios - 转换为二进制 - long long 和 NSUInteger

cocoa - Swift - CLLocationManager 不要求用户许可

iphone - 创建一个简单的 Simon 克隆 : How to wait between updates?

objective-c - NSData 从 NSKeyedArchiver 到 NSString