我不明白为什么我可以归档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'
解决方法
好的,汤姆,你准备好迎接一些极客吗?在这个年轻的鞭挞者的世界里,我是一个“年长”的家伙.但是,我记得有关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需要完全键入,因此它不是匿名结构.