【发布时间】:2014-02-24 23:48:54
【问题描述】:
我创建了两个应用程序,分别称为服务器和客户端。这两个应用程序的 xcode 项目都使用公共子项目。这些应用程序专为特定客户设计,可在 iOS7/iPad 上运行
为了进行测试,我正在编译服务器应用程序并在 iPad 3 上运行它。客户端应用程序在 Air 上运行。当我为 iPad3 编译时,Xcode 会抛出一堆警告,因为 NSInteger/NSUInteger 类型是 32 位的,而我正在使用的逻辑(在本例中为格式为 %lu 的 NSString)正在抱怨(因为它是为 64 位编写的)
但更麻烦的是,我使用 NSKeyArchiving 将数据从一台 iPad 打包发送到另一台 iPad - 如果存储在这些类型中的数据超过 32 位,我猜我会遇到问题。
看起来我需要标准化另一种基本类型,例如 UInt32 而不是 NSUInteger - 这是正确的方法吗?还有其他提示吗?
编辑: 这是一个例子:
+ (NSUInteger)nextTransactionNumber
{
static int64_t currentTransactionNumber = 0;
OSAtomicIncrement64(¤tTransactionNumber);
return currentTransactionNumber;
}
这对于 64 位编译得很好,但在返回 32 位时会感到悲哀。那我用 Uint32 更好吗?
【问题讨论】:
-
您应该能够通过将 (long) 放在整数前面来解决这个问题——免费桥接在大多数情况下会消除 32 位问题。
-
如果有任何数据在机器之间发送,即使是不必要的,最好标准化大小(uint32_t、uint64_t)和字节顺序(使用 ntohl、ntohs 等)。