如何使用-[NSCoder encodeBytes:length:]
和-[NSCoder decodeBytesWithReturnedLength:]
加倍?
我有一个符合NSCoding
的对象,有两个double
属性,目前正在使用NSNumber
对这些值进行编码/解码:
- (id)initWithCoder:(NSCoder *)decoder
{
if (!(self = [super init]))
return nil;
latitude = [(NSNumber *)[decoder decodeObject] doubleValue];
longitude = [(NSNumber *)[decoder decodeObject] doubleValue];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:[NSNumber numberWithDouble:latitude]];
[coder encodeObject:[NSNumber numberWithDouble:longitude]];
}
然而,这给了我不可接受的性能(使用我的测试数据解码时间为6秒,这比生产数据小得多)。
如果我使用密钥,我可以使用-encodeDouble:forKey:
,但我没有使用密钥(它们很慢),而且与Mac OS X不同,iOS上没有-encodeDouble:
方法。 / p>
所以,我需要使用encodeBytes:length:
和decodeBytesWithReturnedLength:
,但我的C能力非常有限。我不确定如何在void *
和double
之间进行转换。
答案 0 :(得分:5)
[coder encodeBytes:(void *)&latitude length:sizeof latitude];
NSUInteger length;
latitude = *(double *)[coder decodeBytesWithReturnedLength:&length];
您可以通过NULL
代替&length
。
答案 1 :(得分:4)
你应该只需要做一些事情:
[coder encodeBytes:(void *)&latitude length:sizeof(double)];
然后:
double latitude = *(double *)([coder decodeBytesWithReturnedLength:NULL]);
更新:传递NULL以解码
答案 2 :(得分:3)
[encoder encodeDouble:lat forKey:@"latitude"];
[encoder encodeDouble:lng forKey:@"longitude"];
double lat = [decoder decodeDoubleForKey:@"latitude"];
double lng = [decoder decodeDoubleForKey:@"longitude"];