在苹果推出iPhone5S时,64位的应用就走到了眼前。当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位。

我记得自己刚刚接触电脑时还有16位的系统,指针的寻址范围还是16位的。当年用TurboC时,还要根据应用的大小选择是tiny模式还是其他。后来很长一段时间使用32位的模型编程,4G是牢牢记住的一个边界条件。而现在,64位走到了眼前。

就如同16位转向32位一样,硬件肯定是最先推出的,SDK也会跟进,然后各种第三方的应用才会逐步跟进,这个过程一般都需要持续一段时间。这次苹果在推出之后,很长一阵子也处于32位和64位并行的过渡期,但是,随着10月份苹果宣布,2015年2月1日起,上传AppStore的应用都需要支持ARM64了,具体消息请猛戳这里。

于是开始看了一下32位应用如何转成64位应用

1. 基础知识

Xcode 5.0.1开始支持编译32-bit和64-bit的Binary

同时支持32-bit和64-bit,我们需要选择的minimum deployment target为 iOS 5.1.1

64-bit的Binary必须运行在支持64-bit的CPU上,并且最小的OS版本要求是 7.0.3

2. 让应用兼容64位的基本步骤

安装Xcode5.0.1或者以后——其实现在能提交AppStore的Xcode版本最少也要5.1.1

在Xcode中打开工程,编译,修正错误以及警告,尤其是针对32位和64

在Project Setting里面,把最小应用使用的SDK改到5.1.1或者更高的版本

把Architectures参数设置成“Standard Architectures (including 64-bit).”

这样你的应用就支持了64位的CPU,再次修复编译器的错误和警告,请注意,有些问题编译器是没有警告的

在64位的真机上测试你的应用

使用Instruments查看内存使用的状况

3. 从32位到64位的变化

3.1 数据类型的变化

这里主要是语言内置类型所占的字节数以及字节对齐的不同。在32位的年代,使用的是IPL32的规范,到了64位之后,改成了LP64规范。

除了这些以外,还有浮点类型

数据类型里面,NSInteger在32位时等同于int,在64位时等同于long,而这个数据结构使用很广,很多不规范的时候会直接和int替换使用,在32位是毫无问题,但在64位时,这就是隐患了。CGFloat也有同样的问题,所以代码的检查修改必须仔细。

至于对齐,如果使用了偏移量来访问struct的项,那么需要认真仔细的检查,其余的还算好,当然如果你用了malloc,那么也请检查一下分配的内存大小,建议是多使用sizeof来帮助计算。

还有,针对存储的文件,比如存储在iCloud上的文件,你无法确定是一个32位应用还是64位的应用会去访问,那么请一定把数据内容的解释写成一模一样。

3.2 方法调用上的变化

64位应用要求所有函数都有原型,这本身就是一个好的编码习惯

函数的造型必须和原型完全一致,尤其要避免参数个数未定的函数指针造型(printf一类)

在64位系统在运行时调用函数和32位系统是不同的。主要的区别在于传递具有可变参数个数的函数的参数时,我们来看下面的代码:

int fixedFunction(int a, int b);
int variadicFunction(int a, ...);int main
{int value2 = fixedFunction(5,5);int value1 = variadicFunction(5,5);
}

第一个函数是固定传入2个参数,第二个函数是参数个数不定的,在使用中,也传入了2个参数。在32位系统下,这两个函数的参数传递是非常类似的,而在64位系统下,这两者就是截然不同了。

3.3 汇编的不同

因为是不同的指令集,汇编当然会不同。不过我们一般的应用不会用到汇编,所以这一项比较少遇到。

4. 第三方库

最后,我们项目中使用的第三方库肯定需要支持64位系统,否则还是白搭。所以大家在升级时需要检查自己使用的第三方的库,看是否已经有64位的版本出现了。

苹果目前的系统中(iOS7/iOS8),32位的framework和64位的framework是共存的,所以如果所有的应用都是64位的话,系统就自动不加载32位的framework,这样可以少占用资源,另外对运行的速度是有好处的,也就是说,你会感觉手机运行的快了一点。

应用在兼容64位系统后,内存的占用肯定会变多一点,不过性能也有相应的提升。

iOS上应用如何兼容32位系统和64位系统相关推荐

  1. 32位系统和64位系统的区别是什么

    随着生活的发展电脑也在飞速的更新换代,大家从最早的考虑使用什么版本系统到现在考虑的更多的是选择 32 位还是 64 位的 Windows 系统,大家都知道64位的系统工作能力比起32位系统来的更加优秀 ...

  2. 计算机基础----32位操作系统和64位操作系统的区别

    众所周知,我们通常说操作系统是32位还是64位说的是32位处理器或64位处理器,windows系统有32位和64位,但是最近被问到32位操作系统和64位操作系统有什么区别?一时间只能想到64位操作系统 ...

  3. 32位系统和64位系统的说明

    关于32位系统和64位系统说明 我们常说的32位系统和64位系统,是怎么来的呢? 其实这跟cpu硬件是有关的: 32位的处理器,指的是cpu一次能处理的最大位数是32位,也就是如下: 1111 111 ...

  4. 32位操作系统和64位操作系统的区别

    文章目录 一.32位和64位的关系 二.32位和64位的"位"是什么 三.32位和64位操作系统的区别 1.支持的系统不同 2.运行数据的速度不同 3.支持内存大小不同 4.软件 ...

  5. 32位系统和64位系统各种数据类型占用的空间(字节数)

    不同的平台上对不同的数据类型分配的字节数是不同的,一般的,数据类型的字节数是由编辑器决定的(编译期间决定数据类型长度). 简单来说,平台就是CPU+OS+Compiler,cpu的位是指一次性可处理的 ...

  6. 32位系统和64位系统变量所占空间总结

    随着硬件的不断降价,我们的计算机内存也越来越大.而我们经常使用的Windows操作系统大 都是32位的,4G内存成为一个瓶颈问题.作为软件开发爱好者,如何在64位系统下做程序设计成为了日程中的话题.下 ...

  7. struct结构体在32位系统和64位系统的存储空间的不同

    在64位操作系统上,如下数据结构占用的存储空间大小为多少字节: 1 2 3 4 5 6 struct A{    unsigned int a;    char b[2];    double c; ...

  8. long类型在32位系统和64位系统的问题(android O )

    程序在64位系统运行没有问题,但是在32位系统出现了下面的问题. JNI的代码如下: jmethodID service_setMostSiguuid = env->GetMethodID(se ...

  9. 32位系统和64位系统的辨别

    查看linux机器是32位还是64位的方法: file /sbin/init 或者 file /bin/ls /sbin/init: ELF 64-bit LSB executable, x86-64 ...

最新文章

  1. Python计算机视觉——图像到图像的映射
  2. hdu_5701_中位数计数
  3. Java_案例实例2.约瑟夫环问题
  4. 升级到php7和安装拓展(mac centos)
  5. 前端学习(3325):Mdn说闭包
  6. 微信你scope 参数错误 php,微信开发: scope参数错误或没有scope权限解决方法
  7. 【Elasticsearch】Elasticsearch 分布式一致性原理分析:元数据
  8. 如何更好地刷题?谈谈我的一点看法
  9. DNN2(DotNetNuke2.0)的一些资源
  10. vue-router: 路由传参
  11. 解析OA系统易用性的价值和意义
  12. 计算机存储单元的唯一标志是,存储单元的唯一标志是什么
  13. 三星手机如何通过Exchange账户同步联系人到手机中?
  14. 如何一条命令查询笔记本电池损耗情况-生成报告
  15. React-Native: bios打开VT-x选项
  16. android 摄像头同时打开方式,Android,同时打开前置和后置摄像头
  17. 启动tim时为我自动登录不能勾选(为灰色)
  18. 国际会计准则IFRS9的基本逻辑
  19. 2017京东校招在线编程题——集合
  20. Adb 抓不住Genymotion的解决方法

热门文章

  1. 如何在Google Chrome浏览器中清除浏览历史记录
  2. Dota 2 with Large Scale Deep Reinforcement Learning翻译
  3. C++ 使用OpenSSL 基于SHA1摘要的RSA签名及验签 与Java平台互通
  4. 原创 基于微信小程序毕业设计题目选题课题 羽毛球篮球足球乒乓球场地球馆预约小程序的设计与实现(1)首页
  5. 广搜之原神·稻妻·荒海水位解谜中的两处机关 输入数字生成解谜步骤
  6. 树莓派4B Ubuntu 21.04 自动温控开关风扇以及RPi.GPIO避坑指南
  7. 目前主流的移动广告联盟有哪些呢?
  8. ggplot2——饼图篇
  9. Git解决pull无法操作成功
  10. Qt5对Excel表格简单、高效处理方法