当前位置:硬件测评 > iOS-程序发布-32位和64位系统的兼容性

iOS-程序发布-32位和64位系统的兼容性

  • 发布:2023-09-29 14:44

-->

当苹果推出iPhone5S时,64位应用程序进入人们的视野。当时看到苹果官方信息宣布iOS7.x SDK支持64位应用程序,所有内置应用程序都已经是64位的了。

记得刚接触计算机的时候,还是16位系统,指针的寻址范围还是16位。那时使用 TurboC 时,您必须根据应用程序的大小在微型模式或其他模式之间进行选择。后来我长期使用32位模型编程,4G是我牢记的一个边界条件。现在,64 位已经到来。

就像从16位到32位的过渡一样,硬件肯定会先推出,SDK也会随之推出,然后各种第三方应用程序也会逐渐跟进。这个过程一般需要一段时间。苹果这次推出后,很长一段时间都处于32位和64位并行的过渡期。然而,10月,苹果宣布从2015年2月1日开始,所有上传到AppStore的应用程序都需要支持ARM64。请点击此处了解具体信息。

于是我开始研究如何将32位应用程序转换为64位应用程序

1。基础知识

Xcode 5.0.1开始支持编译32位和64位Binary

同时支持32位和64位,我们需要选择的最低部署目标是iOS 5.1.1

64 位二进制文​​件必须在支持 64 位的 CPU 上运行,最低操作系统版本要求为 7.0.3

2。使您的应用程序兼容 64 位的基本步骤

安装Xcode5.0.1或更高版本 - 事实上,可以提交到AppStore的Xcode版本至少必须是5.1.1

在Xcode中打开项目,编译,修复错误和警告,尤其是32位和64位

在项目设置中,将最小应用使用的SDK更改为5.1.1或更高版本

将架构参数设置为“标准架构(包括 64 位)”。

这样,您的应用程序就支持64位CPU,并且编译器错误和警告再次得到修复。请注意,编译器不会对某些问题发出警告

在真正的 64 位设备上测试您的应用程序

使用Instruments查看内存使用情况

3。从 32 位更改为 64 位

3.1 数据类型的变化

这里的主要区别是语言的内置类型占用的字节数和字节对齐方式。 32位时代,采用的是IPL32规范。达到64位后,改为LP64规范。

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

数据类型中,NSInteger在32位时相当于int,在64位时相当于long。这种数据结构被广泛使用。很多不规范的情况下,会直接替换成int。在32位下是没有用的。问题,但是在64位下,这是一个隐患。 CGFloat也存在同样的问题,所以必须仔细检查和修改代码。

至于对齐,如果使用偏移量访问结构体项,则需要仔细检查。其余的都很好。当然,如果你使用malloc,那么还请检查分配的内存大小。建议经常使用sizeof来帮助计算。

另外,对于存储的文件,例如存储在 iCloud 上的文件,您无法确定是 32 位应用程序还是 64 位应用程序会访问它们,因此请务必解释数据内容完全相同。

3.2 方法调用的变化

64位应用程序要求所有函数都有原型,这本身就是一个很好的编码实践

函数的形状必须与原型完全一致,尤其是参数数量未定的函数指针形状(如printf)应避免

64位系统运行时调用函数与32位系统不同。主要区别在于将参数传递给参数数量可变的函数时。我们看下面的代码:

  1. int 固定函数(int a, int b);
  2. int variadicFunction(int a, ...);
  3. int main
  4. {
  5. int value2 = 固定函数(5,5);
  6. int value1 = variadicFunction(5,5);
  7. }

第一个函数有2个固定传入的参数,第二个函数有可变数量的参数。使用过程中,同样传入了2个参数。在32位系统下,这两个函数的参数传递非常相似,但是在64位系统下,两者完全不同。

3.3 组装差异

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

4。第三方库

最后,我们项目中使用的第三方库必须支持64位系统,否则就没用了。因此,升级时需要检查一下所使用的第三方库,是否已经出现了64位版本。

在苹果当前的系统(iOS7/iOS8)中,32位框架和64位框架并存,所以如果所有应用程序都是64位,系统将自动不加载32位框架。这样可以占用较少的资源,有利于运行速度。换句话说,你会感觉手机运行速度快了一些。

应用程序兼容64位系统后,内存占用肯定会增加,但性能也会相应提高。

-->

相关文章