iOS64位编程

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

int -> NSIntegerunsigned -> NSUIntegerfloat -> 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:

(unsignedlong)items.count 改为NSNumber的@语法糖: @(items.count).

2) int类型转string:

NSInteger i = 10086;

NSString *string = @(i).stringValue;

4. 64-bit下的BOOL32-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/

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航