真机怎么pos机使用方法Instruments

为了节省大家的时间,提供一个演示的Demo给大家。.
下载后解压然后用xcode打开。
编译运行APP后 然后在搜索框内输入任意词汇,点击结果你会看到下面的结果
正如你所见的,这个app很简单.程序其实调用的是Flickr的API,通过app顶部的搜索框执行搜索后在下面的tableview显示你搜索的搜索词,搜索词后面的括号内有搜索结果的个数,点击此行进入一个略所图的结果列表页面 如上图. 点击其中一行 进入图像的大图模式,在这个页面你可以根据需要旋转图像。
到目前为止页面看起来差不多了,你也许会想应该可以直接提交appstore了吧.接下来这篇文章将会教你instruments工具来提高你app性能和稳定性.
“时间探测器”
天下武功,唯快不破。很多公司都信奉这个教条.恨不得把app压法周期压缩到最低,这就导致了开发中隐藏了很多问题,有点经验的工程师草率的优化下,更糟的情况那些没有经验的工程师甚至不会对app进行任何优化.
某种程度上来说,你开发过程中是可以忽略性能优化的. 十年前,移动设备的硬件资源是非常有限的.甚至连浮点数都是被禁止的.因为浮点数能导致代码变大计算的速度变慢.
科技发展如此迅速的今天,硬件很大程度上可以弥补软件的短板.现在的移动设备3D硬件处理的效率甚至媲美于PC机了,但是你不能总依赖于硬件和处理器速度来掩饰你APP做的多垃圾吧.(如果安卓系统跑在Iphone上还能够像iOS一样顺滑吗?其实是一个道理的)
性能这个概念很抽线,所以我们必须借助数据化图形化的输出方式.你可能花一周的时间去优化一个有趣的算法,但是这算法只占总执行时间的0.5%,不管你花多少精力去优化它,没人会注意到.相反一个for循环花费了90%的时间,你稍微修改下就能提高10%的效率,就是这个简单的修改可以得到大家很大的好感.因为.他们运行app时的第一感受就是比之前快了很多.没人会care你修改的是一个多牛逼的算法,还是一个简单的for循环.
这个说明了什么?
与其花费时间在优化小细节上不如多点时间找到你改优化的地方.
下面引出第一个工具 “时间事件查看器”(自己杜撰的名字英文—Time Profiler),———他可以测量时间的间隔,中断程序执行,跟踪每个线程的堆栈.你可以想象下是xcode调试时按下暂停时的画面
比如,100个样本都在做1毫秒的间隔,然后在某个方法堆栈顶部有10个样本,你可以推算出大概的时间有10%个10毫秒花费在此方法中,这是一个近似值.
废话少说,时间是个检测到的。
从xcode的菜单选择Product-Profile,或者选择?
程序会启动Instruments,这时候你会看到一个选择窗口
这是instruments所有测试仪器的面板,选择 “timer profilter” 点击“profile”回启东模拟器和app,此时会要求你输入一次密码,以便instruments能有权限去截获监听此进程。
在工具窗口中,可以看到时间计数,并留下了一个小箭头移动到右侧的图形在屏幕的中央上方。这表明该应用程序正在运行。
现在开始运行app,搜索一些图片,这时候你发现查找一个结果太慢了,而且搜索结果列表页面滚动起来也是让人无法忍受的。
首先,确保工具栏中的视图选择有选择的所有三个选项,如下所示:&
这将确保所有的面板都打开。现在,研究下面的截图和它下面的每个部分的解释:
1. 录控按钮。中间的红色按钮将停止与启动它被点击时,应用程序目前正在分析。注意这实际上是停止和启动应用程序,而不是暂停它。 &
2. 运行定时器和运行导航,定时器显示APP已经运行了多长时间,箭头之间是可以移动的。如果停止,然后使用录制按钮重新启动应用程序,这将开始一个新的运行。显示屏便会显示“run2 of 2”,你可以回到第一次运行的数据,首先你停止当前运行,然后按下左箭头回去。 &
3. 运行轨道。
4. 扩展面板,在时间探查仪器的情况下,它是用来跟踪显示堆栈。 &
5. 详细地面板。它显示了你正在使用的仪器的主要信息,这是使用频率最高的部门,可以从它这里看到cpu运行的时间 &&
6. 选项面板,稍后介绍。
重头戏来了。
执行图像搜索,并深究结果。我个人比较喜欢寻找“狗”,当然你也可以选择任意你想要的内容。比如猫啊美女啊什么的。
现在上下滚动记下列表,让时间探测器测量下数据,然后注意看下屏幕的变化和数值。这些数值反应了CPU周期。
但是你也许会发现下面的数值太多,看你的眼花缭乱。下面打开左边的调用树 然后按着如下的配置
以下介绍下配置选项:
Separate by Thread: 每个线程应该分开考虑。只有这样你才能揪出那些大量占用CPU的&重&线程 &
Invert Call Tree: 从上倒下跟踪堆栈,这意味着你看到的表中的方法,将已从第0帧开始取样,这通常你是想要的,只有这样你才能看到CPU中话费时间最深的方法.也就是说FuncA{FunB{FunC}} 勾选此项后堆栈以C-&B-A 把调用层级最深的C显示在最外面&
Hide Missing Symbols: 如果dSYM无法找到你的app或者系统框架的话,那么表中看不到方法名只能看到十六进制的数值,如果勾线此项可以隐藏这些符号,便于简化数据
Hide System Libraries: 勾选此项你会显示你app的代码,这是非常有用的. 因为通常你只关心cpu花在自己代码上的时间不是系统上的
Show Obj-C Only: 只显示oc代码 ,如果你的程序是像OpenGl这样的程序,不要勾选侧向因为他有可能是C++的 &
Flatten Recursion: 递归函数, 每个堆栈跟踪一个条目
Top Functions: 一个函数花费的时间直接在该函数中的总和,以及在函数调用该函数所花费的时间的总时间。因此,如果函数A调用B,那么A的时间报告在A花费的时间加上B.花费的时间,这非常真有用,因为它可以让你每次下到调用堆栈时挑最大的时间数字,归零在你最耗时的方法。
如果您已启用上述选项,虽然有些值可能会略有不同,下面的结果的顺序应该是类似下表:
通过上面你能看到大部分时间都花在更新表格照片了.
双击此行,然后将会看到如下
那么这很有趣,不是吗!几乎四分之三的时间花费在setPhoto:方法都花在创造照片的图像数据!
现在可以看到的是什么问题,NSData’s dataWithContentsOfURL 方法并不会立即返回,因为要从网上去数据,每次调用都需要长达几秒的时间返回,而此方法运行在主线程,可想而知会有什么结果了.
其实为了解决这个问题,类提供了一个ImageCache 的后台异步下载的方法.
现在,您可以切换到Xcode和手动找到该文件,但仪器有一个方便的“打开Xcode中”按钮,就在你的眼前。找到它的面板只是上面的代码并单击它:
想如下修改
修改好厚,在仪器重新运行该应用程序Product—Profile(或cmd-记住,这些快捷键真的会为您节省一些时间)。
请注意,这个时候会再问一次你是否使用一起。这是因为你还有一个窗口中打开这个程序,及仪器假定您要使用相同的选项再次运行。
执行一些更多的搜索,并注意此时用户界面不是那么卡顿了!这些图像现在异步加载,并缓存在后台,所以一旦他们已经被下载一次,他们不必再次下载。
看上去很不错!是时候发布了吗? 当然还不够
分配,分配,分配
接下来的仪器是分配工具。它能给出你所有创建和存储它们的内存的详细信息,它也显示你保留了每个对象的计数。
关闭仪器,回到Xcode和选择Product-&Profile。然后,从选择器分配并单击配置文件。如下图:
程序再次打开 然后你会看到
这个时候你会发现两个曲目。一个叫(分配)Allocations,以及一个被称为VM Tracker(虚拟机跟踪)。该分配轨道将详细在本教程中讨论;虚拟机跟踪也是非常有用的,但更复杂一点。
所以你的错误会追踪下?
有隐藏的项目,你可能不知道有东西在那儿。你可能已经听说了内存泄漏。但你可能不知道的是,其实有两种泄漏。
第一个是真正的内存泄漏,一个对象尚未被释放,但是不再被引用的了。因此,存储器不能被重新使用。
第二类泄漏是比较麻烦一些。这就是所谓的“无界内存增长”。这发生在内存继续分配,并永远不会有机会被释放。
如果永远这样下去你的程序占用的内存会无限大,当超过一定内存的话 会被系统的看门狗给kill掉.
建立一个场景,你可以检测出无限的内存增长。首先,在应用程序使10个不同的搜索(不要用已经存在的搜索)。确保搜索的一些结果!现在让程序等待几秒钟。
你应该已经注意到,在分配的轨道图不断上升。这是告诉你的,内存被分配了。它的这一特征,将引导你找到无限的内存增长。
你将要执行的是“heap shot analysis”。为此,按这个按钮叫“Mark Heap”。你会发现的详细面板左侧的按钮
按下它,你会看到一个红色的标志出现在轨道上,像这样:
heap shot分析的目的是执行一个动作多次,看看如果内存是否无限增长。搜索一个内容,稍等几秒加载图像,然后返回主页。然后再标记堆。反复这样做不同的搜索。
演戏几个搜索后,仪器会看起来像这样:
这时你应该会疑问。图中的蓝色是怎么回事了,你继续这样操作10次这样的搜索 蓝色还不断变高:
那肯定是不好的。别急,有什么关于内存的警告?你知道这些,对不对?内存警告是告诉一个应用程序,内存警告是ios处理app最好的方式尤其是在内存越来越吃紧的时候,你需要清除一些内存。
内存一直增长其实也不一定是你的代码除了问题,也有可能是UIKit 系统框架本身导致的.
通过选择HardwareSimulate内存警告在iOS模拟器的菜单栏模拟内存警告。你会发现,记忆体使用量出现小幅回落,但绝对不会回到它应该的。所以还是有无限的内存增长发生的地方。
究其原因,堆出手做钻进搜索的每次迭代后,你可以看到内存的分配每个镜头之间。一起来看看在详细信息面板,你会看到一堆一堆的镜头。
在iOS模拟器的菜单栏中选择hardwaresimulate内存警告模拟内存警告。你会发现内存使用会出现小幅回落,但肯定不会回到它应该在的地方。
每一次的搜索后做你可以看到内存已拍摄之间的分配。在详细信息面板看一看,你会看到一好多堆镜头。
第一个堆镜头作为参照,然后随便打开一个堆镜头,你会看到如下:
靠,这是一个很大的对象!从哪里开始看呢?
最好的方式是通过列表,你在你的应用程序直接使用的类。在这种情况下,HTTPHeaderDict,CGRegion,CGPath,CFNumber,等等都是可以忽略了。
但是,一个突出的是UIImage,这肯定是在你程序使用的。点击上的UIImage左侧的箭头显示的完整列表。选择一个,在扩展详细信息面板:
图中灰色的是系统库,黑色部分是你应用的代码,要获得此跟踪更多的上下文,双击唯一的黑框ImageCache方法,这时候将掉转到如下方法
工具是非常有用的,你现在要努力通过自己的代码思考发生了什么.看看通过上面的方法,你会看到它调用一个名为setImage方法:forKey:。这种方法在缓存以防它再次使用以后的应用程序的图像。啊!那么这肯定听起来像它可能是一个问题!
一起来看看该方法的实现:
从网络上下载一个图片添加字典中,你会注意到这些图片从来没有从字典清楚过。
,这就是内存为什么会一直增长,因为应用程序并不会从缓存里删除东西.它只会一直增加他们。
要解决此问题,你需要的是ImageCache收到UIApplication内存吃紧的警告时.清理缓存。
为了使ImageCache能接收通知,修改init方法如下:
注册UIApplicationDidReceiveMemoryWarningNotification执行memoryWarning:方法。
memoryWarning删除缓存中的所有对象。这将确保没有持图像。
为了测试此修复程序,再次启动仪器(从Xcode中有cmd)和重复的步骤。不要忘了在模拟结束内存警告!
注意:请确保您从Xcode中退出,重新构建,而不是仅仅点击仪器仪表上的红色按钮,以确保您使用的是最新的代码。
这一次分析应该是这样的:
这个时候,内存受到内存警告后急剧下降。但还是有一些内存整体增长,但远不及像以前那样。
究其原因还是有一定的增长确实是由于系统库,并没有太多可以做的。看来,系统库不释放所有的内存,这可能是由设计或可能是一个错误。你可以在你的应用程序做的是释放尽可能多的内存越好,你已经做到这一点!
干得好!还有一个问题,修补了, - 仍然有泄漏,你还没有解决的第一种类型的问题。
内存泄漏的仪器。这是用来找到第一类泄漏前面提到的 - 当一个对象不再被引用时出现的那种。
检测泄漏是可以理解的一个很复杂的事情,但泄漏的工具记得,已分配的所有对象,并定期通过扫描每个对象以确定是否有任何不能从任何其他对象访问的。
关闭仪器,回到Xcode和选择Product-&Profile
回到你的应用程序!执行搜索,得到结果。然后点选结果的预览行打开全屏浏览器。按下旋转按钮在左上角,然后再按一次。
回到仪器,等待片刻。如果你已经正确地完成上述步骤后,你会发现泄漏已经出现了!你的工具窗口将看起来像这样:
返回到模拟器,并按下旋转几次。然后返回到仪器和等会,得到如下结果:
哪来的泄漏从哪里来?扩展详细信息面板
在扩展的详细信息面板打开CGContext上名单。在列表中选择CGContext上的元素之一,这表明导致要创建的对象,如下面的堆栈跟踪:
再次,涉及到你的代码中的帧显示为黑色。由于只有一个,双击它,看看代码的方法。
有问题的方法是rotateTapped: ,这是被调用时被窃听旋转按钮的处理程序。这种方法旋转原始图像,并创建一个新的图像,如下:
再次,仪器只能在这里给你一个提示,问题出在哪里,它不能告诉你确切位置的泄漏。这是唯一能够证明你在创建对象泄露的地方.你可能认为ARC并有不可能是造成代码中内存泄漏…对不对?
回想一下,ARC只涉及Objective-C的对象。它不管理保留和的CoreFoundation对象而不是Objective-C的对象的释放。
啊,现在它开始变得明显的问题是什么?
-CGContextRef和CGImageRef对象永远不会被释放!为了解决这个问题,在rotateTapped方法的末尾添加以下两行代码:
这两种调用都需要来维护这两个对象的保留计数。这个说明,你还需要了解引用计数 - 即使你在你的项目中使用的ARC!
从在Xcode中,使用cmd工具构建和运行应用程序。
在使用泄漏仪器仪器再看看应用程序,看看是否泄漏的被固定。如果你正确地遵循上述步骤,泄漏应消失!
本文已收录于以下专栏:
相关文章推荐
这里是原文
为了节省大家的时间,提供一个演示的Demo给大家。代码传送门.
下载后解压然后用xcode打开。
编译运行APP后 然后在搜索框内输入任意词汇,点击结果你会看到...
PDF文档下载:
Instruments 用户指南.pdf (3748 K)
翻译缘由---翻译本身也是强化学习的过程】
之前一直在CocoaChina上面潜水,虽...
最近一直在解决内存泄漏的问题,天天和Instruments这个工具打交道,本来想给大家写一片相关的教程的。但是今天逛论坛的时候发现了别人翻译的文档,写的好,自认为没有办法写出。所以就不写了,在这里把那...
Linux使用sar进行性能分析Linux使用sar进行性能分析
sar命令常用格式
sar常用性能数据分析
整体CPU使用统计-u
各个CPU使用统计-P
内存使用情况统计-r
介绍leakcanary的使用,优缺点以及应用过程中可能出现的问题。
怎样在xcode里面使用Memory Leaks和Instruments教程
  原文链接地址:/2696/how-to-de...
原文链接地址:/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutori...
原文:Instruments User Guide
链接:/library/ios/#DOCUMENTATION/DeveloperTools/...
为了节省大家的时间,提供一个演示的Demo给大家。代码传送门.
下载后解压然后用xcode打开。
编译运行APP后 然后在搜索框内输入任意词汇,点击结果你会...
原文:http://blog.csdn.net/toss156/article/details/7579294
最近一直在解决内存泄漏的问题,天天和Instruments这个工具打交道,本来想给...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)使用instruments工具调试性能 - Jason_Luo - 博客园
Instruments
时间分析器
Core Animation
OpenGL ES驱动
一个可用的案例
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSArray *
@property (nonatomic, weak) IBOutlet UITableView *tableV
@implementation ViewController
- (NSString *)randomName
NSArray *first = @[@"Alice", @"Bob", @"Bill", @"Charles", @"Dan", @"Dave", @"Ethan", @"Frank"];
NSArray *last = @[@"Appleseed", @"Bandicoot", @"Caravan", @"Dabble", @"Ernest", @"Fortune"];
NSUInteger index1 = (rand()/(double)INT_MAX) * [first count];
NSUInteger index2 = (rand()/(double)INT_MAX) * [last count];
return [NSString stringWithFormat:@"%@ %@", first[index1], last[index2]];
- (NSString *)randomAvatar
NSArray *images = @[@"Snowman", @"Igloo", @"Cone", @"Spaceship", @"Anchor", @"Key"];
NSUInteger index = (rand()/(double)INT_MAX) * [images count];
return images[index];
- (void)viewDidLoad
[super viewDidLoad];
//set up data
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i & 1000; i++) {
?//add name
[array addObject:@{@"name": [self randomName], @"image": [self randomAvatar]}];
self.items =
//register cell class
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.items count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//dequeue cell
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
//load image
NSDictionary *item = self.items[indexPath.row];
NSString *filePath = [[NSBundle mainBundle] pathForResource:item[@"image"] ofType:@"png"];
//set image and text
cell.imageView.image = [UIImage imageWithContentsOfFile:filePath];
cell.textLabel.text = item[@"name"];
//set image shadow
cell.imageView.layer.shadowOffset = CGSizeMake(0, 5);
cell.imageView.layer.shadowOpacity = 0.75;
cell.clipsToBounds = YES;
//set text shadow
cell.textLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.layer.shadowOffset = CGSizeMake(0, 2);
cell.textLabel.layer.shadowOpacity = 0.5;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//dequeue cell
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"
forIndexPath:indexPath];
//set text shadow
cell.textLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.layer.shadowOffset = CGSizeMake(0, 2);
cell.textLabel.layer.shadowOpacity = 0.5;
//rasterize
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].使用Instruments的工具
iOSXcodeInstrumentsInstruments是一个官方提供的强大的性能调试工具集。
1.Blank(空模板):创建一个空的模板,可以从Library库中添加其他模板;
2.Activity Monitor(活动监视器):监控进程的CPU,内存,磁盘,网络使用情况 是程序在手机运行真正占用的内存大小
3.Allocations(内存分配):跟踪过程的匿名虚拟内存和堆的对象提供类名和可选保留/释放历史;
4.Cocoa Layout 观察NSLayoutConstraint对象的改变,帮助我们判断什么时间什么地点的constraint是否合理
5.Core Animation(图形性能)这个模块显示程序显卡性能以及CPU使用情况
6.CoreData 这个模块跟踪Core Data文件系统活动
7.Counters 收集使用时间或基于事件的抽样方法的性能监控计数器(PMC)事件 ?
8.Energy Log& 耗电量监控
9.File Activity 检测文件创建,移动,变化,删除等
10.Leaks(泄漏):一般的措施内存使用情况,检查泄漏的内存,并提供了所有活动的分配和泄漏模块的类对象分配统计信息以及内存地址历史记录;
11.Metal System Trace (Metal API是apple 2014年在ios平台上推出的高效底层的3D图形API,它通过减少驱动层的API调用CPU的消耗提高渲染效率。
12.Network 用链接工具分析你的程序如何使用TCP/IP和UDP/IP链接
13.OpenGL ES Analysis 这个模块测量分析OpenGL ES活动正确性检测以及表现问题,提供解决建议
14.System Trace 系统跟踪,通过显示当前被调度线程提供综合的系统表现,显示从用户到系统的转换代码通过两个系统调用或内存操作
15.System Usage 这个模板记录关于文件读写,sockets,I/O系统活动, 输入输出
16.Time Profiler(时间探查):执行对系统的CPU上运行的进程低负载时间为基础采样。
17.Zombies& 测量一般的内存使用,专注于检测过度释放的野指针对象,也提供对象分配统计,以及主动分配的内存地址历史
Leaks,Zombies,Core Animation,Time Profiler,Cocoa Layout,Energy Log,Network
一.Core Animation:
通过联调真机,可以观察到运行时每秒绘制了多少帧(60帧封顶,30帧以下可以感觉到卡顿越低越需要优化):
1.选中Color Blended Layers, 可以得到界面的红绿分布,其中红色的为透明部分,红色部分越多对性能影响越大。
2.监测离屏渲染:
Color Offscreen-Rendered YellowColor Hits Green and Misses Red
看一下淘宝的&
二.性能监控计数器Counters
(CPU Samples 操作是会高,不操作时低切稳定,边玩手机边观察,可以看得到CPU的name )&
三,Energy Log
耗电量监控 (可以看到手机的WiFi状态,蓝牙状态等等)
Leaks一个进程占用的内存空间,包括5种数据区:
(1)BSS段:通常存放未初始化的全局变量
(2)数据段:通常存放已初始化的全局变量
(3)代码段:存放程序执行代码
(4)堆:存放进程运行中被动态分配的内存段,如OC对象等
(5)栈:由编译器自动分配释放,存放函数参数,局部变量等
Analyze-静态分析
检测出的常见的三种泄露
(1).创建了对象没有使用。
(2).创建了对象,且初始化了,但初始化的值一直没有读取过。
Value store to ‘X’during its initialization is never.
(3).Potential leak of an object stored into 'XX'* 。 翻译一下:XX对象的内存单元有潜在的泄露风险。
&&&product ——& Analyze就可以进行静态的内存分析了(或者鼠标左键长安运行按钮的右下角切换到Analyze模式)
Allocations是检测程序运行过程中的内存分配情况的。模板中一个叫(分配)Allocations,以及一个被称为VM Tracker(虚拟机跟踪)。
Allocations可以帮助我们查看全局内存使用情况(Overall Memory Use): 从全局的角度监测应用程序的内存使用情况,捕捉非预期的或大幅度的内存增长。
内存泄漏使用Leaks检测,如果对象发生内存泄漏,detail panel 中会看到对象的retain release历史记录,如果非对象发生内存泄漏,就会看到malloc和free的调用历史。
1.选中Leaks Checks,在Details所在栏中选择CallTree
2.Call Tree会给我们大概的位置,有时候会给我们精确的位置,选中出现内存泄漏的区域,缩小范围,筛选数据。
3.且在右下 Display Settings 中勾选 Invert Call Tree 和 Hide System Libraries 或其他选项可以过滤显示的数据。
4.在导航栏的筛选框中,我们可以输入关键字来筛选数据。
5.双击人头就可以进去对应得函数进行调优
五,Time Profiler
当点击Time Profiler应用程序开始运行后. 就能获取到整个应用程序运行 消耗时间分布 和 百分比.
使用前须知
1.Time Profiler..:
,,MacMacCPUiOSMacGPUiOSCPUGPUGPUCAEAGLLayerOpenGL. .
在发布环境打包的时候,编译器会引入一系列提高性能的优化,例如去掉调试符号或者移除并重新组织代码.另iOS引入一种"Watch Dog"[看门狗]机制.
不同的场景下,“看门狗”会监测应用的性能。如果超出了该场景所规定的运行时间,“看门狗”就会强制终结这个应用的进程.
开发者可以crashlog看到对应的日志.但Xcode在调试配置下会禁用"Watch Dog".
六、查找野指针&Zombies(没怎么用)
在开启ARC后,可以很大程度上避免产生EXC_BAD_ACCESS错误,但也是有出现可能的,比如非NSObject对象的产生的野指针。
1.使用Zombies工具,启动Zombies后在内部设置了NSZombieEnabled为True。
启用了NSZombieEnabled的话,它会用一个僵尸来替换默认的dealloc实现,也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象。
僵尸对象的作用是在你向它发送消息时,就不会向之前那样Crash或者产生 一个难以理解的行为,而是放出一个错误消息,它会显示一段日志并自动跳入调试器,
因此我们就可以找到具体或者大概是哪个对象被错误的释放了。
基本上通过查看Zombies工具给出的信息找出错误代码行是比较简单的,Zombies也只有在产生EXC_BAD_ACCESS错误时才有用。
阅读(...) 评论()主题 : 真机怎么使用Instruments?
级别: 侠客
UID: 535752
可可豆: 217 CB
威望: 203 点
在线时间: 557(时)
发自: Web Page
来源于&&分类
真机怎么使用Instruments?&&&
测试性能,模拟器没问题,但是真机上就卡,想用Instruments 测试真机的性能,但是 没有工程啊????怎么整,哪位大侠说明一下怎么用,或者介绍一下真机测试性能的方法?
级别: 侠客
UID: 564604
可可豆: 748 CB
威望: 683 点
在线时间: 241(时)
发自: Web Page
回 楼主(country_sing) 的帖子
级别: 侠客
UID: 535752
可可豆: 217 CB
威望: 203 点
在线时间: 557(时)
发自: Web Page
回 1楼(liutinghaha) 的帖子
可以了。。。谜一样的XCode...谜一样的iOS
级别: 禁止发言
可可豆: 57 CB
威望: 57 点
在线时间: 25(时)
发自: Web Page
用户被禁言,该主题自动屏蔽!
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版

我要回帖

更多关于 咕咕机 的文章

 

随机推荐