2

どうすればダブルで-[NSCoder encodeBytes:length:]使用できますか?-[NSCoder decodeBytesWithReturnedLength:]

NSCoding2つの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:していません(低速です)。MacOSXとは異なり、-encodeDouble:iOSには方法がありません。

だから、とを使う必要がありますencodeBytes:length: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 に答える