我在Xcode5中开始了一个新项目。我想使用iOS SDK 7
开发应用程序,但要以部署目标iOS 5.0
为目标。当我在Xcode中创建新项目并尝试将部署目标更改为5.0时,我收到了以下消息:
Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.
因此将架构更改为Standard
(不是64位)。我编译,运行,但我不是真的理解刚刚发生的事情。
Xcode项目构建设置中的Architectures
和Valid architectures
设置有什么不同?
如果我将Architectures
设置为排除64位,当我在64位iPhone或iOS模拟器上运行我的应用程序时会发生什么(我知道它是有效的,我只是好奇它下面是什么)?
你能解释一下新的64位架构带来的巨大混乱吗?
发布于 2013-09-21 21:42:06
当您设置为64位时,得到的二进制文件是一个" fat“二进制文件,它包含捆绑了一个瘦fat头部的所有三个Mach-O图像。您可以使用otool或jtool看到这一点。您可以查看包含在iOS 7.0SDK中的一些fat二进制文件,例如AVFoundation框架,如下所示:
% cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/
%otool -V -f AVFoundation 9:36
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture arm64 # The 64-bit version (A7)
cputype CPU_TYPE_ARM64
cpusubtype CPU_SUBTYPE_ARM64_ALL
capabilities 0x0
offset 16384
size 2329888
align 2^14 (16384)
architecture armv7 # A5X - packaged after the arm64version
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V7
capabilities 0x0
offset 2359296
size 2046336
align 2^14 (16384)
architecture armv7s # A6 - packaged after the armv7 version
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V7S
capabilities 0x0
offset 4407296
size 2046176
align 2^14 (16384)
至于二进制文件本身,它使用ARM64位指令集,这是(主要与32位兼容,但)完全不同的指令集。这对于图形程序(使用霓虹灯指令和寄存器)尤其重要。同样,CPU有更多的寄存器,这对程序速度有相当大的影响。在http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons中有一个关于这是否有影响的有趣讨论;到目前为止,基准测试已经清楚地表明是有影响的。
使用otool -tV将转储程序集(如果您使用的是XCode 5或更高版本),然后您可以自己查看指令集差异。大多数(但不是所有)开发人员将对这些更改保持不可知,因为大多数情况下,它们不会直接影响Obj-C (尽管有CG*API),并且必须在低级指针处理方面做更多工作。编译器将发挥它的魔力和优化功能。
https://stackoverflow.com/questions/18913906
复制相似问题