目标C语言 升级到iOS 7.1 SDK后的错误-不再允许具有精度损失的隐式转换



我刚刚将Xcode + iOS SDK升级到最新版本(5.1/7.1),现在我得到了一堆关于隐式转换失去精度的错误(NSIntegerint等)。

有没有人知道是否有一个编译器标志或一些东西,允许我告诉编译器将这些作为警告而不是错误?到目前为止我什么也没找到。我真的不想遍历代码并到处添加显式强制转换,因为这会在很多地方出现。

这是一个有充分理由的错误。NSInteger贯穿你的代码库将确保当你为32位和64位iOS设备编译代码时,它们被一致地处理。在32位的世界里,NSInteger和int是一样的,但随着iPhone 5S和iPad Air的出现,iOS不再只有32位了。

就像其他人说的,如果你不想在现代设备上遇到麻烦,就没有别的办法了。

如果你只是想回去工作,以后处理这个问题,那么你需要从项目的构建设置中的"有效架构"one_answers"架构"项中删除arm64

正如其他人所说,你真的应该修复这些警告,但这是苹果的一个令人不快的小惊喜(也就是说,在Xcode 5.1的构建设置中添加了arm64架构),所以我完全可以理解你想把这些警告暂时放在一边,在你决定升级之前做你正在做的事情。

XCode现在确实包含了arm64架构。NSInteger和nsobjcrtime。h:

中的定义完全不同
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

要处理它,你应该改进你的代码库。首先,你必须始终如一。NSInteger只能分配给NSInteger而不能分配给int。避免使用:

int i = [aString integerValue](因为它返回一个NSInteger)

,

NSInteger i = [aString integerValue](如果它是一个长类型,那么你不会有任何麻烦)

此外,您可能遇到的另一个问题是当您希望从值创建字符串时。你可以这样做:

#define cL(v)    (long)(v)
#define cUL(v)   (unsigned long)(v)
NSLog(@"array.count: %ld", cUL(anArray.count));

数组。Count返回armv7(s)下的无符号int和arm64下的无符号long。如果总是将类型强制转换为unsigned long类型,您将不会再面临任何警告,更重要的是,不会出现任何错误。

这个"逻辑"已经被苹果自己在一些技术会谈视频中介绍过了:https://developer.apple.com/tech-talks/videos/(视频"构建现代iOS游戏")。

你应该把它们放在它们应该在的地方。苹果的抱怨不是没有理由的——它也保证了你以后不会遇到任何奇怪的意外行为。我建议你把他们都找出来。这是极端的,但它是干净的。

最新更新