iOS7下编写64位应用的探索与展望

2013-08-15 00:54杜纪魁
科技视界 2013年27期
关键词:数据类型开发者调用

杜纪魁

(无锡商业职业技术学院 物联网技术学院,江苏无锡 214153)

美国太平洋时间2013年9月10日上午10点,北京时间2013年9月11日凌晨1点,苹果在美国加州总部召开新品发布会。本次发布会上,正式发布iPhone5c和iPhone5s。iPhone5s于9月20日开卖,首批开卖的国家共有九个包括美国、澳大利亚、加拿大、中国(包括香港)、法国、德国、日本、新加坡、英国,而中国首次被苹果列为首批iPhone开卖的国家。

iPhone5s最大的变化是A7的处理器+M7运动协处理器,A7是全球首款被用于智能手机上的ARM架构64位处理器,CPU/GPU性能均比iPhone 5的A6快2倍,CPU性能是初代iPhone的40倍,GPU性能则是初代的56倍[1]。 菲尔·席勒在发布会上表示:“这是有史以来第一个移动端64位处理器,其他人甚至还没有开始讨论64位处理器。增加的寄存器,让A7的计算更有效率,显著提高编码和解码一类计算任务的表现。同时,更高的时钟速度和改进的GPU将使新的iPhone 5S产生质的飞跃。但是64位处理会消耗更多的内存。[2]新平台的投入也使这个平台的开发与老平台应用的升级摆在了开发者面前。

1 IOS应用开发介绍

iOS是由苹果公司为iPhone、iPad等移动设备开发的操作系统,2010年6月更名为iOS。iOS的系统架构分为四个层次:核心操作系统层,核心服务层,媒体层,可轻触层。应用程序由Objective-C语言开发。

想要开发一个IOS应用,就必须用到iOS软件开发套件(SDK)以及苹果公司的集成式开发环境(IDE)Xcode,这些在苹果开发者官方网站可以直接下载(https://developer.apple.com/ios7/)。Xcode有源代码编辑器、图形用户界面编辑器以及其他多种功能,从可定制构建到源代码仓库管理等。Xcode采用单窗口的形式,并将这种形式称为“工作区窗口”,所需要的大部分数据都在这个工作区窗口里面。熟悉Xcode以后,你就能轻松地在编写代码、除错调试和界面设计中变换,而无需来回切换窗口。iOS SDK则能够扩展Xcode工具组,内容包括创建iOS应用专门的工具、编译器和框架等。Xcode提供了一系列用来管理整个开发流程的工具,从创建应用到测试、优化应用,直至上传应用到App Store。

当然,最好的开发套装就是装着Mac ox的Mac苹果电脑,Xcode开发工具,iOS SDK。

所有iOS应用的背后都运行着Objective-C这个面向对象语言。Objective-C是C语言的一个超集,也就是说我们可以在项目中同时使用C语言和Objective-C语言,但是要构建iOS应用必须依靠Objective-C。从这个地方可以看出,在基本语法上,iOS的开发和32位PC应用程序开发没有本质不同,当然,程序架构模式上是有区别的。

2 64位A7处理器介绍及32位应用程序的升级

A7使用的是ARM V8架构,除了使用64位的地址总线和64位的寄存器以外,还增加了寄存器的数量,目前A7中的整数和浮点数寄存器是A6的两倍。

寄存器的增加大大提高了程序的运行速度。将CPU由32位提高到64位,最主要的改变增大了寻址能力,可以突破32位系统只能访问3G内存的限制,但是,32位到64位的改变并不一定意味着程序运行速度的提高,甚至有些情况下会因为64位系统中的数据占用内存变大而导致程序运行速度变慢。而寄存器数量的增加,则直接提高了程序运行速度,当然,前提应用需要重新为64位系统编译一遍,让程序可以充分使用所有的寄存器。

使用苹果公司提供的Xcode 5可以快速将以前的应用编译成64位应用。在编译过程中只需要把支持的设备改成“iOS 7”并把应用的体系结构设置选项由 “Architectures”改成 “Standard Architectures(including 64-bit)”这种支持64平台的即可。

由于64位系统与32位系统在数据类型等方面的差异,任何平台上32位应用升级为64位应用大体使用的方法都是是一个反复迭代的过程,不断地在一些细节问题上来来回回,如字节序、调整编译器选项等等,修改相关代码并测试程序,解决出现的问题。并时不时停下来查看是否达到了总体目标--遵从ANSI标准及源代码将来的可移植性。

Xcode 5编译的iOS 7程序结果包括32位和64位两套二进制代码,在32位的iOS系统上会调用32位的二进制代码,在64位系统上会调用64位的二进制代码,以此来解决向后兼容的问题。

苹果考虑到很多32位的程序可能在没有重新编译的情况下部署到64位系统上,64位的iOS系统中带有两种FrameWork,分别是32位和64位的。当64位的iOS系统运行原来的32位程序时,系统会调用32位的FrameWork作为底层支撑,当系统运行64位程序时,系统会调用64位的FrameWork作为底层支撑。

也就是说,当一个iPhone 5S上同时运行32位程序和64位程序时,系统同时将32位和64位两套FrameWork载入了内存中,所以消耗的内存也比较多。如果一台64位的iOS设备上运行的所有程序都是为64位系统编译过的,iOS系统将只载入64位的FrameWork,这将节省好多内存。所以,如果大家都可以快速将程序传换成64位的,iOS将跑得更快。

3 开发64位的iOS系统主要注意事项[3]

32位的iOS系统和64位的iOS系统主要的差别有两个,一个是数据类型的差别,一个是过程调用方法的差别。在数据类型上,主要的变化是指针类型(Pointer)和长整数类型(long)的长度变化和内存对齐方式的变化,同时也导致了更高级别数据类型的变化,如NSInteger的长度也有变化。

在过程调用方法上,因为ARM V8和ARM V7具有不同数量的寄存器,具有不同的过程调用约定,所以32位系统和64位系统在汇编层级也是不同的。

而这些变化会带来诸多影响,需要我们在转换或开发程序时注意。

3.1 规范不同数据类型间的赋值

由于在32位系统中long和int的长度是一样的,不少开发者习惯将长整型数据(long)赋予整型(int),这在64位系统中是可能会出问题的。因为64位系统中long比int长,将long值赋予int将导致数据丢失。

同样,因为在32位系统中指针类型(Pointer)和整型(int)的长度是一样的,也有开发者习惯把指针类型(Pointer)直接赋给一个整型(int)存放。但在64位系统中就会有问题,因为64位系统中指针类型(Pointer)比整型(int)长,将指针类型(Pointer)值赋予整型(int)将导致地址数据丢失,最终导致严重问题。

同时还有无符号整数和有符号整数的混用等都会出现32位系统与64位系统结果不一致的情况。

例如:

int i=-2;

unsigned int j=1;

long l=i+j;

32位下是-1,在64位下是4294967295。原因在于表达式(i+j)是一个unsigned int表达式,但把它赋值给k时,符号位没有被扩展。要解决这个问题,两端的操作数只要均为signed或均为unsigned就可。

因此,在程序中尽量避免不同数据类型间的转换并进行认真检查和测试才能够保证程序的稳定运行。

3.2 注意与二进制位相关的运算操作

在32位系统上定义一个结构包含两个长整型(long)类型,第二个长整型(long)数值的偏移量是4个字节,可以通过结构地址加4的方式获取,但是在64位系统上就会出错,因为在64位系统中第二个长整型(long)数值的偏移量是8个字节。

其他有关位运算的技术使用中也应注意,比如掩码技术,在使用一个长整型(long)的掩码,转到64位系统后高位都是0,计算出来的结果可能不符合预期。

3.3 其它应注意事项

3.3.1 重视32位应用和64位应用之间的数据交换

大多数iOS应用不可避免的会通过网络交换数据,同时用户保存的数据也可能通过备份等方式在32位系统和64位系统之间切换,所以应用在保存和发送流数据的时候一定要考虑充分。比如数据在32位系统中保存,在64位系统中能否正常打开,或者反过来,在64位系统中保存,在32位系统中打开是否正常。

3.3.2 注意汇编语言代码的规范

如果在应用代码中需要嵌入汇编语言代码,则需要参考64位系统的指令集来编写汇编代码。

3.3.3 不进行可变参数过程与定参过程的相互转换

32位系统和64位系统对于这两种过程调用方式的处理方法不同,因此不要进行类似转换。

3.3.4 iOS 7 开发需要注意的事项

iOS 7的正式上线是随着iPhone5S正式上市开始的。在iOS 7应用没有大量推出之前,苹果公司给开发人员提供过渡性指导:

(1)确保应用内容在半透明的UI元素中清晰可见。

(2)重新设计自定义栏中按键的图标。在iOS 7中,自定义栏发生了较大的改变。

(3)设计好无边框按键,重新设计应用布局。

(4)支持动态输入。在iOS 7中,用户能够调节输入时获选词的大小,开发人员应该注意这一点。

(5)确保应用的手势控制不会与iOS 7中新的手势形成冲突。

(6)注意iOS 7中新的阴影、渐变和切面等视觉效果,以获得最好的视觉体验。

(7)在必要的时候,使用应用在iOS 6系统下最佳的设定,如自动布局等。确保应用没有使用过时的API。

4 总结与展望

总的来说,64位的A7处理和iOS 7都是新生事物——A7是移动智能终端上的第一款64位处理器,而iOS 7的上线也让不少苹果爱好者褒贬不一。但不可否认的是,A7处理器的应用可以使得iPhone的应用运行更流畅,而开发者如果想让用户体验更好,就必须去迎合64位的应用开发特点。

据苹果本周一 (2013年9月23日)公布的数据显示,iPhone 5S和iPhone 5C在上市后首个周末就销售了900万部,远高于iPhone 5上市首个周末500万部的销量。而美国移动应用分析公司Localytics发布调查报告称,苹果最新智能手机iPhone 5C、iPhone 5S上市仅三天时间,就已经占据美国市场iPhone激活率的1.36%。其中,iPhone 5S在美国的激活率是iPhone 5C的3.4倍,在全球市场更是高达3.7倍。[4]这说明更高端速度更快的A7处理器用户会大量涌现,64位的应用开发大有可为。

[1]http://www.apple.com/cn/iphone-5s/[OL].apple,2013-09-10.

[2]64位核心 A7处理器的IPAD或真正取代 PC.http://news.zol.com.cn/article/157559.html[OL].中关村在线,2013-09-13.

[3]64-Bit Transition Guide for Cocoa Touch.https://developer.apple.com/library/ios/navigation/index.html[OL].apple,2013-09-18.

[4]分析公司调查报告出炉:全球5S销量是5C的3.7倍.http://it.sohu.com/20130924/n387106450.shtml[OL].搜狐 IT,2013-09-24.

猜你喜欢
数据类型开发者调用
详谈Java中的基本数据类型与引用数据类型
如何理解数据结构中的抽象数据类型
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
iOS开发者调查
iOS开发者调查
栝楼产业开发者谢献忠
范畴数据类型上的子类型*
利用RFC技术实现SAP系统接口通信