2

我怎样才能使用-[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 不同-encodeDouble:,iOS 上没有方法。

所以,我需要使用encodeBytes:length:and decodeBytesWithReturnedLength:,但我的 C 能力非常有限。我不确定如何在void *和之间转换double

4

3 回答 3

5
[coder encodeBytes:(void *)&latitude length:sizeof latitude];

NSUInteger length;
latitude = *(double *)[coder decodeBytesWithReturnedLength:&length];

您也许可以通过NULL而不是&length.

于 2012-01-07T22:02:21.770 回答
4

您只需要执行以下操作:

[coder encodeBytes:(void *)&latitude length:sizeof(double)];

然后:

double latitude = *(double *)([coder decodeBytesWithReturnedLength:NULL]);

更新:将 NULL 传递给解码

于 2012-01-07T22:03:26.507 回答
3
    [encoder encodeDouble:lat forKey:@"latitude"];
    [encoder encodeDouble:lng forKey:@"longitude"];

    double lat = [decoder decodeDoubleForKey:@"latitude"];
    double lng = [decoder decodeDoubleForKey:@"longitude"];
于 2013-04-15T14:21:56.460 回答