当前位置: 首页 > news >正文

iOS如何兼容的应用程序32位系统和64Bit系统

      苹果发布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中打开project。编译。修正错误以及警告,尤其是针对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位系统后,内存的占用肯定会变多一点,只是性能也有对应的提升。


版权声明:本文博主原创文章,博客,未经同意不得转载。

相关文章:

  • linux下实时查看tomcat运行日志
  • C#中对象的销毁有三种方式Finalize,Dispose,GC。
  • shrio教程初级(八)shiro验证码与记住登录
  • 转载blog_Linux下Tomcat日志定期清理 及 logrotate 配置
  • Android Fragment间对象传递
  • windows下sublime text的node.js开发环境搭建
  • 关于PHP设计模式的分析和理解
  • ibatis设置启用及关闭命名空间
  • struts1和struts2的区别对比
  • HA集群之三:corosync+pacemaker实现httpd服务的高可用(crm的用法)
  • VmWare10 32位安装CentOS7遇到的问题及解决办法
  • 百度地图查询数据结果
  • AngularJs angular.element
  • CUDA学习笔记(五)
  • JVM探索(二)
  • 【comparator, comparable】小总结
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Angular数据绑定机制
  • EventListener原理
  • GraphQL学习过程应该是这样的
  • HTTP请求重发
  • iOS 颜色设置看我就够了
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • js学习笔记
  • leetcode-27. Remove Element
  • mysql 数据库四种事务隔离级别
  • nginx 配置多 域名 + 多 https
  • PHP那些事儿
  • spring学习第二天
  • Vue ES6 Jade Scss Webpack Gulp
  • 对超线程几个不同角度的解释
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 服务器之间,相同帐号,实现免密钥登录
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用putty远程连接linux
  • 学习ES6 变量的解构赋值
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 优秀架构师必须掌握的架构思维
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #考研#计算机文化知识1(局域网及网络互联)
  • $.ajax()方法详解
  • (1)Android开发优化---------UI优化
  • (12)Linux 常见的三种进程状态
  • (2020)Java后端开发----(面试题和笔试题)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (arch)linux 转换文件编码格式
  • (LeetCode 49)Anagrams
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)计算机毕业设计高校学生选课系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (算法)前K大的和
  • (算法)求1到1亿间的质数或素数
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置