正确处理32/64位

时间:2014-02-24 23:48:55

标签: ios nscoding

我创建了两个应用程序,称之为服务器和客户端。这两个应用程序的xcode项目都使用常见的子项目。这些应用程序专为特定客户设计,可在iOS7 / iPad上运行

为了测试,我正在编译服务器应用程序并在iPad上运行3.客户端应用程序正在Air上运行。当我为iPad3及其编译时,Xcode会抛出一堆警告,因为NSInteger / NSUInteger类型是32位且我使用的逻辑(在这种情况下NSString格式为%lu)正在抱怨(因为它是为64位编写的) )

但更令人不安的是,我使用NSKeyArchiving将来自一个iPad的数据打包发送给另一个 - 我猜我存在这些类型的数据超过32位时会遇到问题。

看起来我需要标准化另一种基本类型,比如UInt32而不是NSUInteger - 这是正确的方法吗?还有其他提示吗?

修改 这是一个例子:

+ (NSUInteger)nextTransactionNumber
{
    static int64_t currentTransactionNumber = 0;
    OSAtomicIncrement64(&currentTransactionNumber);
    return currentTransactionNumber;
}

这适用于64位,但对32位的回报感到悲伤。所以我最好使用Uint32吗?

1 个答案:

答案 0 :(得分:0)

NSNumber是个不错的选择。

您可以对其进行序列化,反序列化,打印所有内容而不会出现32/64位问题(除非您计划使用超过40亿的数字)。

NSNumber *number = @1000U;

要打印出来:

NSString *string = [NSString stringWithFormat:@"%@", number];

进行计算:

NSUInteger value = [number unsignedIntegerValue];

归档:

- (void)encodeWithCoder:(NSCoder *)encoder {
    // …
    [encoder encodeObject:self.number forKey:@"number"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self) {
        // …
        _number = [decoder decodeObjectForKey:@"number"];
    }
    return self;
}