锦集06- Xcode调试技巧
简介:
工欲善其事,必先利其器。熟练掌握Xcode的调试技巧,能够在写代码中提高效率
1. 快速打开
- 快速打开(Open Quickly)命令在Xcode的File菜单中;快捷键Command+Shift+O.
- 这个命令可以开启一个小窗格用来快速搜索浏览文件、类、算法以及函数等。
- 搜索范围为当前整个项目
-
示例:
2. 显示项目导航器
- 在一个有很多文件和文件夹的大型项目中, 显示项目导航命令(Reveal in Project Navigator) 可以为你节省很多时间,这个命令可以在界面左侧的项目导航栏中显示当前文件,默认快捷是Command + Shift + J.
- 场合:当你直接通过搜索到某一个文件夹中,然而你需要在左边的项目文件列表同时定位到这个文件夹
- 方法:
- 在改文件夹中右击-> Reveal in Project Navigator
- 直接使用快捷键:Command + Shift + J
3. Standard Editor
- Show Previous History(control + 2)
- 显示你之前浏览的历史,包括浏览那些文件,浏览那些文件里面的那个方法、函数
- Show Top Level Items(control + 4)
- 显示这个项目中所有的project列表
- show Group Files(control + 5)
- 显示当前这个组中所有的文件
- show Document Items(control + 6)
- 显示当前这个文件中所有的函数、方法列表
-
Show Related Items
- Recent Files
- 最近浏览了那些文件
- Categories
- 当前类拥有多少类扩展
- 当前类拥有多少分类
- Protocols
- 当前类遵守了多少协议
- Includes
- 当前类包含了多少头文件
- Included By
- 当前类头文件被哪些类包含
- Callers:
- 当前光标定位的方法、函数,被哪些类的哪些方法调用
- Callees
- 当前光标定位的方法、函数中调用了哪些类的哪些方法
- Recent Files
4. 断点:
- 普通断点:
- 在你想要设置断点的代码行左边设置即可,不在赘述。
- 快捷键设置:command+\
- 条件断点:
- 设置普通断点
- 右击普通断点-> Edit BreakPoint
-
测试代码如下:
- (void)viewDidLoad { [super viewDidLoad]; for (int i = 0 ; i<6; i++) { NSLog(@"=========="); //在这一行打了断点 } }
-
设置i==3 时候,断点
-
忽略前4个断点,在第5个时候停下:
-
监听某个方法被调用的次数,注意要选中
Automatically continue after evaluating actions.
-
全局断点
-
符号断点:
- 在你指定的[类名 方法名]时中断执行,
[ClassName viewDidLoad] (Objective-C)
或ClassName.viewDidLoad (Swift)
即可。-
比如:
unrecognized selector sent to instance 0xaxxxx
这种错误,这个instance可以这样快速定位
-
- 在某个方法被执行的时候调用,整个项目中只要某个类调用了这个方法就会断点
- 比如: 在 Symbol 一栏输入 viewDidLoad。 这样一来,在程序中所有的 viewDidLoad 方法被调用时都会触发断点。
- 在你指定的[类名 方法名]时中断执行,
5. 僵尸对象:
- iOS中把那些已经release但还没完全消失的对象叫做僵尸对象,对已经release的对象再次释放,就会发生异常。虽然自从使用ARC后,由于对象释放产生的异常已经大大变少,但偶尔还会出现。开启僵尸对象模式后,就能快速定位到异常位置。开启方式如下:Product–>Scheme–>Edit Scheme. 勾选Enable Zombie Objects即可。
6. lldb命令
- Xcode中使用llvm编译器,公认为最好的C、C++、OC、Swift编译器。而lldb是llvm中的调试器,我们可以使用一些简单的命令进行调试
- 断点调试中,使用po命令、print命令在Console控制台打印出变量信息。
7. 生命周期方法 init,dealloc
- 一般项目都要创建一个基类,封装一些公共的东西,比如:
BaseViewController
-
可以在这个方法中重写dealloc,可以看到当ViewController退出的时候某个对象是否release。
-(void)dealloc{ NSLog(@"%@控制器已死!!!!",[self class]); }
8. NSLog打印
-
使用宏做了部分优化,能够打印出所在类名、所在方法名、详细时间、行号。
//NSLog宏 #define FileLastName [@__FILE__ lastPathComponent] #ifdef DEBUG #define NSLog(fmt, ...) NSLog((@"%s-%@-%d------ZHLog------\n" fmt),__func__,FileLastName ,__LINE__,##__VA_ARGS__); #else #define NSLog(...) #endif
9. 视图调试
- 如今iOS开发的UI设计有很多种方式,比如storyboard,xib,代码实现。对于stoayboard,xib可视化实现是比较简单的,但是对于一些“iOS老程序员”而言,都喜欢使用代码实现UI,并且可能UI层次还比较复杂。这样就给我们新接手项目的开发者带来很多困扰。如何快速查看一个复杂UI的界面层次和布局,最快的方法就是用到视图调试。
- 进入试图调试,你可以很方便的查看这个界面。这里可以看到控件之间的层次关系。
- 左侧的树形层次图可以在查看线程、队列和UI之间切换:
-
如下图:
10. analyze与Profile (instruments)
- Product-> analyze
- analyze可以快速的发现你的代码中release的问题,以及继承过程中的父类方法缺失等等问题
- Product-> Profile(instrument)
- instrument里面包含了很多工具,内存溢出分析,性能分析,各种分析……
- 其中leaks是专用debug的内存溢出分析工具
- leaks略讲(网上很多)