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