Xcode 5和iOS 7:体系结构和有效体系结构

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

我在Xcode 5中开始了一个新项目。我想开发应用程序,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项目构建设置有什么 区别ArchitecturesValid architectures设置? 如果我设置Architectures排除64位在64位iPhone或iOS模拟器上运行我的应用程序时发生的情况(我知道它有效,但我只是好奇底下会有什么)? 你能解释一下新的64位体系结构的大混乱吗?

提问于
用户回答回答于

将构建设置中的体系结构设置为 标准体系结构(armv7,armv7s)

iPhone 5S采用A7 64位处理器。从苹果文档

Xcode可以使用32位和64位二进制文​​件构建应用程序。这个组合的二进制文件需要iOS 7或更高版本的最低部署目标。 注意:未来版本的Xcode将允许您创建一个支持iOS 6及更高版本的32位运行时的应用程序,并支持iOS 7上的64位运行时。

从我所了解的文件是

  • Xcode可以为单个应用程序创建64位32位二进制文​​件,但部署目标应为iOS7。他们将来会说iOS 6.0
  • iPhone 5S(64位处理器)中的32位二进制文​​件可以正常工作。

(Xcode 5.0.1) 在Xcode 5.0.1中,他们添加了为iOS 5.1.1开始创建64位二进制文​​件的支持。

Xcode 5.0.1可以构建包含32位和64位二进制文​​件的应用程序。这个组合的二进制文件需要iOS 5.1.1或更高版本的最低部署目标。64位二进制文​​件仅在运行iOS 7.0.3及更高版本的64位设备上运行。

(Xcode 5.1) Xcode 5.1在体系结构部分进行了重大更改。

用户回答回答于

当设置64位时,生成的二进制文件是一个“Fat”二进制文件,其中包含所有三个与文件头捆绑在一起的Mach-O图像。你可以看到使用otool或jtool。您可以查看一些包含在iOS 7.0 SDK中的胖二进制文件,例如AVFoundation Framework,如下所示:

% 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位兼容,但是)完全不同的指令集。这对于图形程序(使用NEON指令和寄存器)尤其重要。同样,CPU有更多的寄存器,这对编程速度产生了相当大的影响。在http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons上有一个有趣的讨论这是否有所作为 ; 基准测试迄今已清楚地表明它确实如此。

使用otool -tV将转储程序集(如果您有XCode 5及更高版本),然后您可以看到自己的指令集差异。大多数(但不是全部)开发人员对这些改变仍然不知情,因为大部分开发人员不会直接影响Obj-C(尽管CG * API),并且必须在低级别的指针处理方面做更多的工作。编译器将发挥它的魔力和优化。

扫码关注云+社区

领取腾讯云代金券