【发布时间】:2012-01-07 21:54:25
【问题描述】:
如何将-[NSCoder encodeBytes:length:] 和-[NSCoder decodeBytesWithReturnedLength:] 与double 一起使用?
我有一个符合 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: 方法。
所以,我需要使用encodeBytes:length: 和decodeBytesWithReturnedLength:,但是我的C 能力非常有限。我不确定如何在void * 和double 之间进行转换。
【问题讨论】:
-
解决这个问题后的一点反馈。更改为双精度并没有带来任何明显的性能改进,但它确实将存档的文件大小减少了大约 20%。
-
等等,你为什么不直接使用
encodeDouble:/decodeDouble: -
这两个只有现有的 Cocoa。它们在 UIKit 中不存在。由于某种原因,UIKit 只有
encodeDouble:forKey:
标签: objective-c ios double nscoding