根据文档翻译的总结: 在高级别上,下面的步骤创建一个应用程序,目标32位和64位运行时环境:
1. 安装最新的Xcode。
2.打开你的项目。Xcode提示您现代化项目。现代化的项目添加新警告和错误64位的重要当编译你的应用程序。(个人觉得就是编译程序,看编译警告)
3. 更新您的项目设置支持iOS 5.1.1或更高版本。你不能建立一个64位的项目如果目标一个iOS版本早于iOS 5.1。
4. 把架构构建设置在您的项目中“标准体系结构(包括64位)。”(在“Build Setting”中将“Architectures”改成“Standard Architectures (including 64-bit))
5.更新您的应用程序支持64位运行时环境。新编译器警告和错误将有助于指导您完成这一过程。然而,编译器并不为你做所有的工作,使用本文档中的信息来帮助指导您完成调查自己的代码。
6.实际的64位硬件上测试应用程序。iOS模拟器还可以在开发过程中是有用的,但有些变化,比如函数的调用约定,是可见的只有当你的应用程序在设备上运行。
关于Xcode “Build Setting”中的Architectures参数问题
1.Architectures:你想支持的指令集。(支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。)
2.Valid architectures:即将编译的指令集。(Valid architectures和Architecture两个集合的交集为最终编译生成的版本)
3.Build Active Architecture Only:是否只编译当前设备适用的指令集(如果这个参数设为YES,使用iPhone 6调试,那么最终生成的一个支持ARM64指令集的Binary。一般在DEBUG模式下设为YES,RELEASE设为NO)
(以下文字说明:总结起来就是说32位中和64位中的数据存储类型发生了改变,会导致存储的数据变化,所以以后在新开发的代码中需要过滤c语言的基础类型,推崇使用oc数据存储的类型)
具体做法:
int -> NSInteger
unsigned -> NSUInteger
float -> CGFloat
动画时间-> NSTimeInterval
例子:NSInteger i = 10086;
NSString *string = @(i).stringValue;
开发人员根据以下要点来检查原来的32位代码就可以将应用移植到64位系统上了:1.不要将长整型数据(long)赋予整型(int)这种代码在32位系统上没有问题,因为在32位系统中long和int的长度是一样的,不过在64位系统中就有可能出问题,因为64位系统中long比int长,将long值赋予int将导致数据丢失。2.不要将指针类型(Pointer)赋予整型(int)为了方便地址计算,有时程序员会将指针类型赋予整型,这种代码在32位系统上没有问题,因为在32位系统中Pointer和int的长度是一样的,不过在64位系统中就会有问题,因为64位系统中Pointer比int长,将Pointer值赋予int将导致地址数据丢失,最终导致严重问题。3.留意那些和数位相关的数值计算比如掩码技术,如果使用一个long类型的掩码,转到64位系统后高位都是0,计算出来的结果可能不符合预期。还有无符号整数和有符号整数的混用等。4.留意对齐方式带来的变化如果在32位系统上定义一个结构包含两个long类型,第二个long数值的偏移地址是4,可以通过结构地址+4的方式获取,但是在64位系统上就不行了,因为在64位系统中第二个long数值的偏移地址是8。5.充分考虑在32位应用和64位应用之间的数据交换因为用户会通过网络交换数据,同时用户保存的数据也可能通过备份等方式在32位系统和64位系统之间切换,所以应用在保存和发送流数据的时候一定要考虑充分。比如数据在32位系统中保存,在64位系统中能否正常打开,或者反过来,在64位系统中保存,在32位系统中打开是否正常。6.重写所有汇编代码这点无需说明,如果你在代码中嵌入了汇编代码,你需要参考64位系统的指令集重写汇编代码。7.不要将可变参数的过程强制转换为定参过程,也不要将定参过程强制转换为可变参数的过程这时因为32位系统和64位系统对于这两种过程调用方式的处理方法不同。