以下是我遇到的一些警告和错误:
警告:
Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead
错误:
Symbol(s) not found for architecture x86_64
谢谢。
Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead
错误:
Symbol(s) not found for architecture x86_64
Xcode 5.1 更改了标准项目设置。其中之一是将 arm64
架构加入到项目中 - 但很多第三方项目尚未支持,因此建议再次从 architectures 设置中删除它(只留下armv7
和armv7s
)。不过要保留在 valid architectures 设置中,以指定其可以运行的架构。
它还引入了某些额外警告的默认激活,例如转换为长整型的警告-同样的情况也适用于使用许多其他库(作为源代码)的情况下,您可能会收到很多警告,而这些警告您无法或者不想花费太多精力去解决。您可以禁用这些项目的警告,或选择不立即更新项目设置。
进入构建设置 -> 架构
你可能已经设置为标准架构,对吧?
Xcode 5.1 版本以后,标准架构包含 arm64,而你还没有准备好支持它。
选择“其他..”,双击$(ARCHS_STANDARD)并将其更改为$(ARCHS_STANDARD_32_BIT)
注意:这只是一个临时解决方案。你可能正在使用某个没有64位切片的静态库。请查看是否有可用的64位版本,然后将架构切换回标准架构。
现在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
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));
在armv7(s)下,array.count返回一个无符号整型(unsigned int),而在arm64下则返回一个无符号长整型(unsigned long)。通过始终将其转换为无符号长整型(unsigned long),您将不会再面临任何警告,并且更重要的是,不会出现任何错误。
这种“逻辑”是由苹果公司自己在一些技术讲座视频中引入的,其中包括: https://developer.apple.com/tech-talks/videos/ (视频名称为"Architecting Modern iOS Games". 在10分钟左右播放)