您的位置:首页 > 移动开发 > IOS开发

iOS应用支持64位系统及Instruments工具使用详解

2015-01-08 15:46 806 查看
以下的解释是在Xcode6上的,少年与时具进吧,别再用屌丝的Xcode5.1了,哈哈(这只是建议,当然也可以使用Xcode5.1,但是以后估计还要遇到很多的问题啊。)

苹果在10月20号发布了一条消息:从明年的二月一号,提交到Appstore的应用必须支持64-bit的操作系统。这对于最近的项目来说不会带来什么影响(如果你使用的是Xcode6),但是对于在苹果发布iOS8之前的项目(也就是使用Xcode5.1开发的项目)来说就需要注意了。



Xcode5.0.1开始支持编译32位和64位,但是如果想要同时支持32位和64位,必须在Xcode中选择minimum deployment target 为iOS 5.1.1,64位的Binary必须运行在支持64-bit CPU(即Arm架构为ARMv8/ARM64)上,并且最小的版本要求是7.0.3.

以下是iPhone系列的cpu支持的arm架构:

ARMv8/ARM64: iPhone 6(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)
ARMv7s: iPhone 5, iPhone 5c, iPad 4 
ARMv7: iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini   
ARMv6: iPhone, iPhone 3G, iPod 1G/2G


其实在更改Xcode中项目的架构还是比较容易的,只需要在Build Setting 中完成一些简单的设置即好。

如下:

更改前:



更改后:



下面是有关设置参数的一些详细的解释

Architectures:你想支持的指令集。(支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。)
Valid architectures:即将编译的指令集。(Valid architectures 和 Architecture两个集合的交集为最终编译生成的版本)
Build Active Architecture Only:是否只编译当前设备适用的指令集(如果这个参数设为YES,使用iPhone 6调试,那么最终生成的一个支持ARM64指令集的Binary。一般在DEBUG模式下设为YES,RELEASE设为NO)

对于支持的64-bit,我们可以设置Architectures为Stand architectures,在最新Xcode6上,它包括armv7和arm64.



具体的更改如下:

1.确保Xcode版本>=5.1.1

2.改变Architecture为Standard architecture(armv7,arm64)-$(ARCHS_STANDARD)

3.运行测试代码,按照错误和警告一个接一个的解决久行了。

4.在真实的64-bit机器上测试(iPhone5s以上)。

5.使用instruments查看内存的使用问题。(什么,问我什么是instrumnets工具?我也不知道。。。)

不想看可以跳过大括号



先普及一下instruments工具吧:这是一个查看内存泄漏及内存占用情况的工具:

1.

.


2.耐心的等一会,就出现下面的工具了啊

3.其实这个工具很强大的,苹果公司也是极力的推荐使用它。



下面是对一些常用的工具的简单的介绍(括号内为本人所理解,请您参照):

1.Allocations :跟踪堆内存分配,以测量内存的使用情况(主要使用它来进行对项目各个模块,动态的进行内存消耗的监测)

2.Leaks :度量内存的使用情况,检查内存泄漏并提供有关对象分配的统计信息(这个工具可以动态检测内存泄漏,同时兼容了检测内存的使用情况。)

3.Time Profiler :对系统的CPU运行的进程进行基于时间的采样,开销很低。(就是代码执行完成所需要的时间,有百分比的呈现,详情见下面

注意:并非在什么情况下都可以使用所有的这些工具。例如,仅当在模拟器中运行时,才能使用工具CoreData,而仅当在实际设备上运行应用时,才能使用工具Network。

Timer Profiler:

1.开始:



2.运行



蓝色部分:此部分为运行时的状态,此为CPU的使用率。(拖拽蓝色的部分可以获悉特定时间的CPU的使用率)

红色部分:此部分为每个模块占用的时间百分比(大部分的时间都在Main中)

橙色部分:此部分为每个模块的具体方法(点开时可以具体跳转到具体的代码)

绿色部分:此部分为两个部分,Invert Call Tree (反转调用树,可以从上往下显示方法的消耗时间。) Hide System Libraries (隐藏系统的东东)

虽然此工具并非每行代码都有优化的空间,但知道各行代码占用的处理时间,应用优化起来就容易多了。

Leaks(由于在Leaks中已经存在了Allocations这个工具,所以就只讲Leaks了):

1.开始(同上直接点击红色的按钮)

2.运行






选择不同的选项,就可以呈现不同的形式。使用方法同Time Profiler。



注意所有的在Instrumnets中看到的代码都不可编辑,还是需要你去Xcode中编辑的。

好了,Instruments的介绍就到这了。



64-bit 主要的变化

64位和32位运行时环境有以下两点的不同

1.数据类型的改变

2.方法调用上的改变

数据类型的改变如下:



浮点类型的变化:



数据类型的改变可能会为我们的程序带来这些影响:

1.增加内存的压力(这也是我为你介绍Instrumnets的原因,要为程序做一下检查)

2.64位到32位的数据之间的相互转化(比如:NSinterger到int间的转化,你知道64的时候NSinterger是8字节,而32的时候是4字节。而int类型的没有改变)

3.计算可能会产生不同的结果(如用NSinterger表示的数付给了int类型,就有可能发生位数的截取,只要数的位数超过32位)

方法调用上的改变:

基于32-bit的CPU和基于64-bit上的CPU有不同数量的寄存器,在方法调用上有不同的协议。因此32-bit和64-bit在汇编层级上是不同的。如果我们在程序中不使用汇编编程,调用协议很少会遇到。

如何编写健壮的64-bit的代码:

1.不要将长整型long赋值给整型int (64-bit上会导致数据丢失)

2.不要将指针类型pointer赋值给整型int (64-bit导致地址数据丢失)

3.留意数值计算(掩码计算,无符号整数和有符号整数同时使用等)

4.留意对齐方法带来的变化

5.32-bit到64-bit之间数据转化(通过网络传递的用户数据,可能同时存在于32-bit和64-bit的环境下)

6.重写汇编代码

7.不要在可变参数方法和不可变参数方法之前进行强制转化

目前本人更改后遇到的问题是:

1.报错:



这是更改64位后项目中报的错误和警告

其中错误的原因是:

注意红色框中英语提示说

1.libopencore-amrnb.a(这是我项目中的一个第三方的静态库)缺少必须的x86_64位的架构。

2.libwechat.a同理

这时我们需要做的就是去官网更新一下静态库,即下载新的静态包,然后在工程中替换。这就解决了问题。这就是最普通的最笨的方法。但是如果使用的是CocoaPods,一句代码就能实现更新。本人博客有关于CocoaPods的详细的教程:点击打开链接

第二,其中项目中还会增加很多的警告:



其中这个警告就是最常见的,其中的原因就是上面所说的,在64位下,NSInteger和Int类型已经不匹配了,所以可以将int类型改为NSInteger类型。

如果这还是不能解决您的问题:可以参考点击打开链接,或者给我发邮件649704832@qq.com一起交流学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: