64-bit运行时环境和32-bit运行时环境主要有以下两点的不同:
1:数据类型的改变
2:方法调用上的改变
整型数据类型的变化如下
关于字节对齐的概念可以参考如下链接:http://blog.csdn.net/21aspnet/article/details/6729724#comments
浮点型类型的改变如下
:
数据类型的改变可能会为我们的程序带来这些影响:
增加内存压力
64-bit到32-bit数据之间的相互转化
计算可能产生不同的结果
当把一个值从大的数据类型拷贝到小的数据类型,数据可能被截断。(NSInteger -> int)
方法调用上的改变
基于32-bit的CPU和基于64-bit上的CPU有不同数量的寄存器,在方法调用上有不同的协议。因此32-bit和64-bit在汇编层级上是不同的。如果我们在程序中不使用汇编编程,调用协议很少会遇到.
如objc_msgSend的变化:
((id (*)(id, SEL, id))objc_msgSend)(plugin , selector,cmd);
替换成
void (*objcMsgSend)(id, SEL, id) = (void*)objc_msgSend;
objcMsgSend(plugin , selector,cmd);
如何编写健壮的64-bit代码
- 不要将长整型long赋值给整型int (64-bit上会导致数据丢失)
- 不要将指针类型pointer赋值给整型int (64-bit导致地址数据丢失)
- 留意数值计算(掩码计算,无符号整数和有符号整数同时使用等)
- 留意对齐方法带来的变化
- 32-bit到64-bit之间数据转化(通过网络传递的用户数据,可能同时存在于32-bit和64-bit的环境下)
- 重写汇编代码
- 不要在可变参数方法和不可变参数方法之前进行强制转化
具体:http://www.codeceo.com/article/ios-64-bit.html