iOS 64 Bit Support

终于到了升级的时候了,App Store自2015后,在审核时加入了对64位的要求。

Missing 64-bit support

Beginning on February 1, 2015 new iOS apps submitted to the App Store must include 64-bit support and be built with the iOS 8 SDK.

Xcode中64位编译支持,见:Xcode中Architecturs配置及问题

iPhone & ARM & 指令集

iPhone 5S,iPhone 6 及 iPhone 6s都配备ARM64指令集的芯片。

64位优缺点

能一次处理64位,更快的运算能力。内存上也能使用更大。

寻址范围、最大内存容量、数据传输和处理速度、数值精度等指标也成倍增加,带来的结果就是CPU的处理能力得到大幅提升,尤其是对强烈依赖数值运算、存在巨量数据吞吐和需要超大并发处理的应用提升效果非常明显,如科学计算、人工智能、平面设计、视频处理、3D动画和游戏、数据库以及各种网络服务器等。

64 位架构主要的缺点是,相对于 32 位架构,占用相同的数据会消秏更多的内存空间(由于肿胀的指针,地址变成64位了,所以指针(64位)也变大了。以及其它型态和对齐补白等可能)。这会增加进程对内存的需求,且可能会影响高效能处理器高速缓存的使用。

Upgrade Tips

- 第三方库的升级

如果是源码,直接修改编译时的Architectures,加入arm64即可,如果是 .a,就需要提供方在编译时加入arm64支持了。

更多关于Architectures,见:Xcode中Architecturs配置及问题

- 查看是否支持arm64

使用 lipo -info 可以查看,一个库文件所支持的 CPU 指令集:

1
2
$ lipo -info libPods.a
Architectures in the fat file: libPods.a are: ARMv7 ARM64

更多内容,可以用 lipo -detailed_info 查看。

- 安装包合并大小问题

在编译时,选定 Build Active Architecture OnlyNO,编译出的 ipa 文件会大出不少,这是因为多个不同指令集的包被合并在了一起,在发布时,为了让不同指令集的手机都能使用,这里必须设置为 NO

Xcode 6后,默认支持 armv7 和 arm64,而放弃了 arm7s,可能就是因为这个原因吧。

- 代码升级

在升级64位时,对旧的代码,要注意以下事项:

一些基本类型,像int,long… 在不同的处理器架构下,大小是不一样的,要注意这种区别和隐式转换带来的问题。

1. Format字符串

适配64-bit时,你是否遇到了下面的恶心写法:

1
2
NSArray *items = @[@1, @2, @3];
NSLog(@"个数:%lu", (unsigned long)items.count);

优美写法:使用 NSNumber@语法糖

1
2
NSArray *items = @[@1, @2, @3];
NSLog(@"个数:%@", @(items.count));

也可以可以通过 stringValue 转字符串(缺点,Float 不适用, 如 %.2f):

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

2. 枚举

枚举应该使用新版的写法,为枚举指定类型,不然会有编译警告:

1
2
3
4
5
6
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
UIViewAnimationCurveEaseInOut,
UIViewAnimationCurveEaseIn,
UIViewAnimationCurveEaseOut,
UIViewAnimationCurveLinear
};

REF::