以下作品,但这是最好的办法吗?这不必要地创建对象。
@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;}解决方法 问题是NSUInteger可能与unsigned int的大小不一样。在许多(如果不是大多数)Mac OS X机器,NSUInteger将是一个无符号长,将是两倍大。另一方面,一个键控的归档器应该处理这个没有问题,因为它构建一个字典。
更复杂的事情是NSCoder没有任何处理无符号类型的方法。我不能想到这将会导致任何数据丢失,但它需要一些丑陋的演员,加上它只是感觉很脏。
如果要坚持无符号类型,最简单的方法是使用encodeBytes对最大类型(无符号长整型)编码原始字节(最好使用htonl和ntohl的网络字节顺序):length:forKey:和decodeBytesForKey :returnedLength :.为了最大程度的安全,您应该检查您解码的长度并投射指针(或使用联合)来提取正确大小的类型。
其缺点是该值将在输出中表示为数据,而不是整数。这主要仅在有人决定阅读原始pList数据的档案,而不是像你这样使用关键的unarchiver,甚至只对他们。其他可能重要的情况是,如果Apple(或者)应该切换到具有更大整数类型的体系结构,那么其大小的位数不是2的幂(至少有一个字是24的旧平台)位)或具有不寻常布局的类型(不是大或小端)。
对于您的NSNumber解决方案:您可能想要在“属性列表编辑器”中破解您的存档,并查看它发出的内容。如果输出包含整数元素,那么它与使用encodeInteger:forKey:相同。如果输出包含一个数据元素,那么它与上面提到的解决方案相同。要彻底,您应该检查您支持的每个架构的输出。
总结以上是内存溢出为你收集整理的objective-c – 如何使用NSCoding存储NSUInteger?全部内容,希望文章能够帮你解决objective-c – 如何使用NSCoding存储NSUInteger?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)