Joh*_*ool 25 cocoa objective-c
如何存储NSUInteger使用的NSCoding协议,因为没有任何方法对NSCoder类似-encodeUnsignedInteger:(NSUInteger)anInt forKey:(NSString *)aKey像有是NSInteger?
以下是有效的,但这是最好的方法吗?这确实会不必要地创建对象.
@interface MYObject : NSObject <NSCoding> {
    NSUInteger count;
}  
- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:[NSNumber numberWithUnsignedInteger:count] forKey:@"count"];
}
- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self != nil) {
        count = [[decoder decodeObjectForKey:@"count"] unsignedIntegerValue];
    }
    return self;
}
Pau*_*olt 26
NSNumber有很多方法来存储/检索不同大小和签名的类型.这是最简单的解决方案,不需要像其他答案所建议的任何字节管理.
以下是根据NSNumber上Apple文档的类型:
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value
- (NSUInteger)unsignedIntegerValue
是的,您的代码示例是编码/解码NSUInteger的最佳方式.我建议使用常量作为键值,所以你不要输入错误并引入存档错误.
static NSString * const kCountKey = @"CountKey";
@interface MyObject : NSObject <NSCoding> {
    NSUInteger count;
}  
@end
@implementation MyObject
- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:[NSNumber numberWithUnsignedInteger:count] forKey:kCountKey];
}
- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self != nil) {
        count = [[decoder decodeObjectForKey:kCountKey] unsignedIntegerValue];
    }
    return self;
}
@end
Pet*_*sey 12
问题是NSUInteger可能与a的大小不同unsigned int.在许多(如果不是最多的话)Mac OS X机器上,NSUInteger它将是一个unsigned long,它将是两倍大.另一方面,键控归档器应该没有问题地处理它,因为它构建了一个字典.
更复杂的是,NSCoder没有任何方法来处理无符号类型.我无法想象这会如何导致任何数据丢失,但它需要一些丑陋的演员,加上它只是感觉很脏.
如果你想坚持要求一个无符号的类型,最简单的方法是将编码的原始字节(最好使用网络字节顺序htonl,并ntohl在可用的最大型)( unsigned long long)使用encodeBytes:length:forKey:和decodeBytesForKey:returnedLength:.为了最大限度地提高安全性,您应该检查解码的长度并转换指针(或使用联合)来提取正确大小的类型.
这样做的缺点是该值将在输出中表示为数据,而不是整数.这主要是因为有人决定读取存档的原始plist数据而不是像你那样使用键控的unarchiver,甚至只读它们.可能重要的其他情况是,Apple(或您)是否应该切换到具有更大整数类型的体系结构,类型的位大小不是2的幂(至少有一个旧平台,其中一个单词是24位)或具有不寻常布局的类型(不是大端或小端).
至于您的NSNumber解决方案:您可能想要在Property List Editor中打开存档并查看其发出的内容.如果输出包含整数元素,那么它与使用相同encodeInteger:forKey:.如果输出包含数据元素,那么它与我上面提到的解决方案相同.要彻底,您应该检查您支持的每个体系结构的输出.
| 归档时间: | 
 | 
| 查看次数: | 8216 次 | 
| 最近记录: |