2024年10月6日发(作者:富幻翠)
iOS 7下编写64位应用的探索与展望
【摘 要】随着iPhone 5S的上市,苹果应用开发者也早已经开始关心5S上
所使用的64位CPU A7了。本文简明扼要地介绍传统32位IOS系统的开发知识
和64位IOS系统的运行机制,提出32位IOS应用向64位IOS应用转换的方法,
着重分析为二者开发应用过程中所应重点注意的环节,希望能为学习开发者提供
帮助。
【关键词】iOS开发;64位应用;IOS应用升级
美国太平洋时间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:///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:///cn/iphone-5s/[OL].apple,2013-09-10.
[2]64位核心A7处理器的IPAD或真正取代:
///article/[OL].中关村在线,2013-09-13.
[3]64-Bit Transition Guide for Cocoa :
///library/ios/navigation/[OL].apple,2013-09-18.
[4]分析公司调查报告出炉:全球5S销量是5C的3.7倍.http:
///2013 0924/[OL].搜狐IT,2013-09-24.
2024年10月6日发(作者:富幻翠)
iOS 7下编写64位应用的探索与展望
【摘 要】随着iPhone 5S的上市,苹果应用开发者也早已经开始关心5S上
所使用的64位CPU A7了。本文简明扼要地介绍传统32位IOS系统的开发知识
和64位IOS系统的运行机制,提出32位IOS应用向64位IOS应用转换的方法,
着重分析为二者开发应用过程中所应重点注意的环节,希望能为学习开发者提供
帮助。
【关键词】iOS开发;64位应用;IOS应用升级
美国太平洋时间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:///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:///cn/iphone-5s/[OL].apple,2013-09-10.
[2]64位核心A7处理器的IPAD或真正取代:
///article/[OL].中关村在线,2013-09-13.
[3]64-Bit Transition Guide for Cocoa :
///library/ios/navigation/[OL].apple,2013-09-18.
[4]分析公司调查报告出炉:全球5S销量是5C的3.7倍.http:
///2013 0924/[OL].搜狐IT,2013-09-24.