PDF地址 :http://download.csdn.net/detail/songhongri/6433813
随着IOS 7 和 iPhone5s 占有比例越来越高,64 位的编程 或 对现有项目64位的转换就显得尤为重要了,为了迎合市场的需要,小弟找来官方文档想好好研究一下,小弟不才,英语不好,但正好又想做点什么,干点以前没干过的,所以就萌生了决定翻译它,但断断续续持续了一个多月才完成。(很遗憾没有占上第一个坑)
发现苹果给出的最新文档和翻译时的文档有出入,下面是截图
Xcode用32位和64位的二进制文件来构建你的应用。这种结合的二进制的需要iOS 6或更高版本的最小部署环境。64位二进制仅运行在iOS 7或更高版本。如果是一个已经存在的应用程序,你应该先更新你的应用到iOS 7,然后部署到64位处理器上。通过更新到iOS 7,你可以移除过时的代码路径和使用最新的句子。如果你正在创建一个新的应用,选中iOS 7环境和编译你的应用程序的32位和64位版本。当IOS 程序在64 位的设备上运行时,IOS 包含区分 32位和 64 位的框架。当一个设备上的所有应用程序都支持 64 位的话,IOS 将不会加载32 位相关的库文件,这就意味着系统将消耗更小的内存,启动APP的速度也将快很多,内存的减少即使没给app 性能上带来太大的提高,由于所有的内置app都支持 64 位的运行环境,它也将会让每一个运行在64 位的设备上的应用程序受益,特别是那些需要在后台进行处理的应用程序。
在开始构建 64 位的app的时候,尽量修复 和 64 位相关的警告,例如:
1.确保所有的方法调用都有一个合适的原形。
2.避免由于将一个 64 位的数据应用到32 位置上而将 其切断
3.确保你64位的APP 所有的计算 都是正常工作的。
4.在 32 位 和64 位中app 中使用相同的数据结构 (例如当你写一个文件到ICoud)
一定要拿真机测试你的64 位应用程序,因为只有在真机上运行才能发现一些改变。当你运行你的程序的时候,请分析你的性能和内存使用情况,提高它们是很有必要的。
下面 表格1-1 将会描述所有整型数据的一些改变,其中高亮的部分是LP64 和 ILP32 的不通之处。
Table 1-1 Size and alignment of integer data typesin OS X and iOS
Integer data type | ILP32 size | ILP32 alignment | LP64 size | LP64 alignment |
char | 1 byte | 1 byte | 1 byte | 1 byte |
BOOL, bool | 1 byte | 1 byte | 1 byte | 1 byte |
short | 2 bytes | 2 bytes | 2 bytes | 2 bytes |
int | 4 bytes | 4 bytes | 4 bytes | 4 bytes |
long | 4 bytes | 4 bytes | 8 bytes | 8 bytes |
long long | 8 bytes | 4 bytes | 8 bytes | 8 bytes |
pointer | 4 bytes | 4 bytes | 8 bytes | 8 bytes |
size_t | 4 bytes | 4 bytes | 8 bytes | 8 bytes |
NSInteger | 4 bytes | 4 bytes | 8 bytes | 8 bytes |
CFIndex | 4 bytes | 4 bytes | 8 bytes | 8 bytes |
fpos_t | 8 bytes | 4 bytes | 8 bytes | 8 bytes |
off_t | 8 bytes | 4 bytes | 8 bytes | 8 bytes |
|
|
|
|
|
表格1-2 将描述浮点型数据的一些改变
Floating-point type | ILP32 size | LP64 size |
float | 4 bytes | 4 bytes |
double | 8 bytes | 8 bytes |
CGFloat | 4 bytes | 8 bytes |
转换64位需要注意事项的总结
1. 不要将64 位的长整型 转换成 32位的整型
2. 不要将64位的指针转换成 32 的整型
int *c = something passed in as an argument....
int *d = (int *)((int)c + 4); // Incorrect.
int *d = c + 1; // Correct!
|
3. 避免因为数学计算引起的指针和长整型类型的截断
4. 修复因数据大小引起的标准性问题
5. 确保 32 位和64位共用的数据有相同的数据结构。
6. 重写汇编语言来满足64位的操作码和运行环境
7. 避免将可变的参数的方法和不可变的方法进行转换
你永远不要假设NSInteger 和 int 是同样大小的,如下面有很少一些特许的例子需要看一下:
1. 从NSNumber 类型对象转换过来或转换成NSNumber 的时候
2. 用NSCode 类进行编码和解码的时候,如果你在64位的设备上将NSInteger 编码,然后在32位的设备上解码,如果值的范围超出了32位解码方法将会抛出异常。你应该 使用严格的整型数据类型代替
(参考“使用严格的整型数据类型”)
3. 使用框架中用NSInteger 定义的常量,例如 NSNotFound ,在64位中,它的值是比 int 类型最大值是大的,所以截取它的值经常导致错误。
CGFloat 变成了64位。和NSInteger 一样,你也不要假设CGFloat 和 float 或者 double 一样,所以坚持使用CGFloat类型吧。
// Incorrect. CGFloat value = 200.0; CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &value); // Correct! CGFloat value = 200.0; CFNumberCreate(kCFAllocatorDefault, kCFNumberCGFloatType, &value); |
好吧 ,大致内容就写这么多吧,要想获取更多内容请看《IOS 7 64位改变指南.pdf》