iOS 64位编程

1.拒绝基本数据类型和隐式转换

1)基本数据类型

64位下,基本类型long从占用4字节变为占用8字节。要注意看一下程序中出现sizeof函数的地方,并注意尽量不要使用基本数据类型,改用对象类型:

  • int -> NSInteger
  • unsigned -> NSUInteger
  • float -> CGFloat
  • 动画时间 -> NSTimeInterval

2)隐式转换

NSArray *items = @[<a href="http://www.jobbole.com/members/1/" rel="nofollow">@1</a>, @2, @3];
for (int i = -1; i < items.count; i++) {
    NSLog(@"%d", i);
}

数组.count返回值类型是NSUInteger,但这里与i比较时,若i为-1,-1会被隐式转换为很大的正整数,导致计算出错。一定要注意和这个变量相关的所有操作(赋值、比较、转换)

这里将基本数据类型改为NSUInteger,初始值从0开始即可。此处只为举例,遍历还是用for-in或block更方便。

2.使用新版枚举

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    UIViewAnimationCurveEaseInOut,
    UIViewAnimationCurveEaseIn,
    UIViewAnimationCurveEaseOut,
    UIViewAnimationCurveLinear
};

  

3.替代Format字符串

1) unsigned long类型转为NSNumber:

(unsigned long)items.count 改为NSNumber@语法糖: @(items.count).

2) int类型转string:

NSInteger i = 10086;
NSString *string = @(i).stringValue;

4. 64-bit下的BOOL

32-bit下,BOOL被定义为signed char,@encode(BOOL)的结果是‘c‘
64-bit下,BOOL被定义为bool,@encode(BOOL)结果是‘B‘

5.不直接取isa指针

编译器已经默认禁用了这种使用,isa指针在32位下是Class的地址,但在64位下利用bits mask才能取出来真正的地址,若真需要,使用runtime的object_getClass 和object_setClass方法。

6.解决第三方lib依赖和lipo命令

把target加上arm64编译,静态库(.a)或者framework,就需要重新找支持64-bit的包.

7.支持64-bit后程序包会变大么?

会。

Checklist

最后列一下官方文档中的注意点:

  • 不要将指针强转成整数
  • 程序各处使用统一的数据类型
  • 对不同类型的整数做运算时一定要注意
  • 需要定长变量时,使用如int32_t, int64_t这种定长类型
  • 使用malloc时,不要写死size
  • 使用能同时适配两个架构的格式化字符串
  • 注意函数和函数指针(类型转换和可变参数)
  • 不要直接访问Objective-C的指针(isa)
  • 使用内建的同步原语(Primitives)
  • 不要硬编码虚存页大小
  • Go Position Independent

参考文章:

http://ios.jobbole.com/81561/

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。