objective-c – NSKeyedArchiver失败并带有CLLocationCoordinate2D结构.为什么?

前端之家收集整理的这篇文章主要介绍了objective-c – NSKeyedArchiver失败并带有CLLocationCoordinate2D结构.为什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不明白为什么我可以归档CGPoint结构但不归档CLLocationCoordinate2D结构.归档者有什么不同?

平台是iOS.我正在模拟器中运行,并没有尝试过该设备.

// why does this work:
NSMutableArray *points = [[[NSMutableArray alloc] init] autorelease];
CGPoint p = CGPointMake(10,11);
[points addObject:[NSValue valueWithBytes: &p objCType: @encode(CGPoint)]];
[NSKeyedArchiver archiveRootObject:points toFile: @"/Volumes/Macintosh HD 2/points.bin" ];

// and this doesnt work:
NSMutableArray *coords = [[[NSMutableArray alloc] init] autorelease];
CLLocationCoordinate2D c = CLLocationCoordinate2DMake(121,41);
[coords addObject:[NSValue valueWithBytes: &c objCType: @encode(CLLocationCoordinate2D)]];
[NSKeyedArchiver archiveRootObject:coords toFile: @"/Volumes/Macintosh HD 2/coords.bin" ];

我在第二个archiveRootObject上崩溃,并且此消息被打印到控制台:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '*** -[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs'

解决方法

@H_404_13@ 好的,汤姆,你准备好迎接一些极客吗?在这个年轻的鞭挞者的世界里,我是一个“年长”的家伙.但是,我记得有关C的一些事情,我只是一个内心的怪人.

无论如何,这之间有一个微妙的区别:

typedef struct { double d1,d2; } Foo1;

还有这个:

typedef struct Foo2 { double d1,d2; } Foo2;

第一个是匿名结构的类型别名.第二个是struct Foo2的类型别名.

现在,@ encode的文档说明了以下内容

typedef struct example {
    id   anObject;
    char *aString;
    int  anInt;
} Example;

对于@encode(示例)或@encode(示例),将导致{example = @ * i}.所以,这意味着@encode正在使用实际的struct标签.对于为匿名结构创建别名的typedef,看起来@encode总是返回?’

看一下这个:

NSLog(@"Foo1: %s",@encode(Foo1));
NSLog(@"Foo2: %s",@encode(Foo2));

无论如何,你能猜出CLLocationCoordinate2D是如何定义的吗?是的.你猜到了.

typedef struct {
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;

我想你应该就此提交一份错误报告.要么@encode被破坏,因为它不使用别名typedef到匿名结构,或者CLLocationCoordinate2D需要完全键入,因此它不是匿名结构.

猜你在找的C&C++相关文章