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架构:
其实在更改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一起交流学习。
苹果在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一起交流学习。
相关文章推荐
- iOS开发人员必备App开发工具 ifunbox 支持iPhone, iPad和iPod Touch的文件及应用管理神器 使用实例
- IOS应用开发版本控制工具之Versions 和SVN 的 使用方法详解
- iOS 32位、 64位系统兼容性设置-Xcode创建支持IOS4.3以上版本的应用的方法
- Android中使用GridView分页显示系统所安装的应用,支持拖动与手势滑动
- ios Instruments 工具使用
- Android中使用系统桌面背景作为应用背景,支持拖动
- 让iOS应用支持不同版本的系统与设备
- Android中使用系统桌面背景作为应用背景,支持拖动
- 64位系统使用VS2010开发32位ASP.NET应用--注意事项
- linux vmstat命令详解和使用实例(linux系统监控工具)
- 让iOS应用支持不同版本的系统与设备
- Android中使用GridView分页显示系统所安装的应用,支持拖动与手势滑动
- Android中使用系统桌面背景作为应用背景,支持拖动
- OLAP工具在企业决策支持系统中的应用
- Android中使用GridView分页显示系统所安装的应用,支持拖动与手势滑动
- Android中使用GridView分页显示系统所安装的应用,支持拖动与手势滑动
- Android中使用系统桌面背景作为应用背景,支持拖动
- IOS应用开发版本控制工具之Versions使用
- IOS应用开发版本控制工具之Versions使用
- IOS应用开发版本控制工具之Versions使用