iOS上应用如何兼容32位系统和64位系统

      在苹果推出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位系统是不同的。主要的区别在于传递具有可变参数个数的函数的参数时,我们来看下面的代码:

[objc] view plaincopy

  1. int fixedFunction(int a, int b);  
  2. int variadicFunction(int a, ...);  
  3.    
  4. int main  
  5. {  
  6.     int value2 = fixedFunction(5,5);  
  7.     int value1 = variadicFunction(5,5);  
  8. }  

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

3.3 汇编的不同

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

4. 第三方库

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

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

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

时间: 2024-10-18 18:09:35

iOS上应用如何兼容32位系统和64位系统的相关文章

字节跳动-一个字节一定等于8位(b)吗??在什么情况下是不等于的,32位系统和64位系统有什么区别?

问题描述 一个字节一定等于8位(b)吗??在什么情况下是不等于的,32位系统和64位系统有什么区别? 一个字节一定等于8位(b)吗??在什么情况下是不等于的,32位系统和64位系统有什么区别? 解决方案 最初的计算机性能和存储容量都比较差,所以普遍采用4位BCD编码(这个编码出现比计算机还早,最早是用在打孔卡上的).BCD编码表示数字还可以,但表示字母或符号就很不好用,需要用多个编码来表示.后来又演变出6位的BCD编码(BCDIC),以及至今仍在广泛使用的7位ASCII编码.不过最终决定字节大小

32位系统和64位系统有什么含义

电脑的发展史是从以前的8位.16位发展到先的32位和64位,位数是用来衡量计算机性能的重要标准之一.位数在很大程度上决定着计算机的内存最大容量.文件的最大长度.数据在计算机内部的传输速度.处理速度和精度等性能指标. 32位系统是指在操作系统针对32位的cpu设计,就是32处理器一次性能处理32位也就是4字节的数据,而64系统是操作系统针对64位的cpu设计,就是一次性能处理64位也就是8位字节,在这里在工作频率相同的前提下,64位的cpu处理速度就比32位的高一倍.当然这只是32位系统和64位系

一个32位系统和64位系统的一个weblogic server 分别支持 最大的内存 和 最合理的并发量是多少

问题描述 一个32位系统和64位系统的一个weblogicserver分别支持最大的内存和最合理的并发量是多少?有没有什么行业标准值呢?假如我的系统每天有好几万用户访问,设置多少个weblogicserver合理些?希望有知道的朋友能给介绍介绍,非常感激!!! 解决方案 解决方案二:在weblogic中间件中的32位还是64位是取决于硬件支持和jdk的版本支持的.在硬件支持的条件下,32位jdk的最大进程空间是4g.64位jdk的最大进程空间理论上接近于无限大解决方案三:我也遇到个类似的问题:现

关于32位系统和64位系统运行asp。net程序的兼容性问题。

问题描述 我现在做了一个asp.net网站,用的C#.vs2008开发环境,操作系统是windowsserver2008x32.数据库:oracle10g.运行一切正常.现在客户换了一台服务器,装windowsserver2008X64版本.不知道我的这个网站部署到64位的系统是有问题没有.如果有兼容问题,该怎么解决. 解决方案 解决方案二:如果程序是纯.NET写的,完全没有问题.如果程序使用了32bit的dll或者activex组件,那么需要把程序集编译成32bit.解决方案三:网页中有一个f

Win7 32位系统和64位系统有什么区别

  首先,相信选择64位Windows7的网友中很有大比例是内存大于或等于4GB的.在32位Windows7下,可能会显示内存可使用3.25G,这让很多网友感到不安.没错,可寻址的内存空间确实是32位Windows7和64位Windows7最为显著的特点. 32位的CPU(准确的说是运行在32位模式下的CPU)只能寻址最大4GB的内存,受制于此,32位的操作系统也只能识别最大4GB的内存,由于在系统中,除了内存之外,还有很多存储设备,因此,真正可以利用的内存空间肯定小于4GB,也就是我们看到的系

Windows 7 32位系统和64位系统有区别是什么

选择64位Windows7系统是因为很内存大于或等于4GB的.在32位Windows7下,可能会显示内存可使用3.XXG,可寻址的内存空间是32位Windows7和64位Windows7最为显著的特点.32位的CPU(准确的说是运行在32位模式下的CPU)只能寻址最大4GB的内存,受制于此,32位的操作系统也只能识别最大4GB的内存,由于在系统中,除了内存之外,还有很多存储设备,因此,真正可以利用的内存空间肯定小于4GB,也就是我们看到的系统属性中显示的3.xxG.但64位CPU则有了很大改变,

c++-在VS.net2003中用C++写的项目,从32位迁移到64位机器上后遇到引用第三方库的问题

问题描述 在VS.net2003中用C++写的项目,从32位迁移到64位机器上后遇到引用第三方库的问题 在VS.net2003中用C++写的项目,从32位迁移到64位机器上后,原来引用的SDK/DXSDK第三方库中头文件包含VS.net2003中的Winsock2.h文件的路径错误,应该去"C:/ProgramFiles (x86)/""下去寻呼,但是他还去""C:/ProgramFiles/""路径去寻找,这个是什么造成的?怎么解决啊

c++-开发32位程序和64位程序有什么区别?假设用C++开发

问题描述 开发32位程序和64位程序有什么区别?假设用C++开发 假设现要开发一个win程序,用C++语言,那么开发我32bit程序跟开发64bit程序有什么区别? 解决方案 你是问开发有什么不同,ok,其实google一下答案就有了. 1. 首先数据类型不一样 在32位平台整型啊,指针啊都是32位的,到64位平台就是64位了,你要注意这个区别,比如溢出. 还有一些数据结构变化了,比如time_t,你的小心. 浮点数的结构也在32和64也不太一样 2. 数据转换发生了变化,比如在32位平台做以下

Windows 7系统迁移指南——从32位过渡到64位

Windows--包括http://www.aliyun.com/zixun/aggregation/34065.html">WindowsXP,Vista,Windows 7以及该操作系统的服务器版本--已经从32位过渡到了64位.硬件制造商有足够的时间为其产品提供32/64位的驱动程序. 事实上,我们现在买到的几乎每个扫描仪,打印机,视频摄像头或其他硬件设备都能提供这两种平台的驱动.因此如果我们添置一套新设备时无需担心兼容问题.但是如果我们要将以前购买的打印机,扫描仪或摄像头进行迁移,