事实上,XCode 现在包含 arm64 架构。NSInteger 现在完全不同了,因为它在 NSObjCRuntime.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));
array.count 在 armv7(s) 下返回一个 unsigned int,在 arm64 下返回一个 unsigned long。通过始终转换为 unsigned long,您将不再面临任何警告,更重要的是,不会出现任何错误。
这种“逻辑”是苹果自己在一些技术讲座视频中介绍的:
https ://developer.apple.com/tech-talks/videos/ (视频“架构现代 iOS 游戏”。播放视频大约 10 秒)