锦集06- Xcode调试技巧

简介:

工欲善其事,必先利其器。熟练掌握Xcode的调试技巧,能够在写代码中提高效率

1. 快速打开

  1. 快速打开(Open Quickly)命令在Xcode的File菜单中;快捷键Command+Shift+O.
  2. 这个命令可以开启一个小窗格用来快速搜索浏览文件、类、算法以及函数等。
  3. 搜索范围为当前整个项目
  4. 示例:

    图1

2. 显示项目导航器

  1. 在一个有很多文件和文件夹的大型项目中, 显示项目导航命令(Reveal in Project Navigator) 可以为你节省很多时间,这个命令可以在界面左侧的项目导航栏中显示当前文件,默认快捷是Command + Shift + J.
  2. 场合:当你直接通过搜索到某一个文件夹中,然而你需要在左边的项目文件列表同时定位到这个文件夹
  3. 方法:
    1. 在改文件夹中右击-> Reveal in Project Navigator
    2. 直接使用快捷键:Command + Shift + J

3. Standard Editor

图1

  1. Show Previous History(control + 2)
    1. 显示你之前浏览的历史,包括浏览那些文件,浏览那些文件里面的那个方法、函数
  2. Show Top Level Items(control + 4)
    1. 显示这个项目中所有的project列表
  3. show Group Files(control + 5)
    1. 显示当前这个组中所有的文件
  4. show Document Items(control + 6)
    1. 显示当前这个文件中所有的函数、方法列表
  5. Show Related Items

    图1

    1. Recent Files
      1. 最近浏览了那些文件
    2. Categories
      1. 当前类拥有多少类扩展
      2. 当前类拥有多少分类
    3. Protocols
      1. 当前类遵守了多少协议
    4. Includes
      1. 当前类包含了多少头文件
    5. Included By
      1. 当前类头文件被哪些类包含
    6. Callers:
      1. 当前光标定位的方法、函数,被哪些类的哪些方法调用
    7. Callees
      1. 当前光标定位的方法、函数中调用了哪些类的哪些方法

4. 断点:

  1. 普通断点:
    1. 在你想要设置断点的代码行左边设置即可,不在赘述。
    2. 快捷键设置:command+\
  2. 条件断点:
    1. 设置普通断点
    2. 右击普通断点-> Edit BreakPoint
    3. 测试代码如下:

       - (void)viewDidLoad {
           [super viewDidLoad];
           for (int i = 0 ; i<6; i++) {
               NSLog(@"=========="); //在这一行打了断点
           }
       }
      
    4. 设置i==3 时候,断点

      图1

    5. 忽略前4个断点,在第5个时候停下:

      图1

    6. 监听某个方法被调用的次数,注意要选中Automatically continue after evaluating actions.

      图1

  3. 全局断点

    图1

  4. 符号断点:

    图1

    1. 在你指定的[类名 方法名]时中断执行,[ClassName viewDidLoad] (Objective-C) ClassName.viewDidLoad (Swift) 即可。
      1. 比如:unrecognized selector sent to instance 0xaxxxx 这种错误,这个instance可以这样快速定位 图1

        图1

    2. 在某个方法被执行的时候调用,整个项目中只要某个类调用了这个方法就会断点
      1. 比如: 在 Symbol 一栏输入 viewDidLoad。 这样一来,在程序中所有的 viewDidLoad 方法被调用时都会触发断点。

      图1

5. 僵尸对象:

  1. iOS中把那些已经release但还没完全消失的对象叫做僵尸对象,对已经release的对象再次释放,就会发生异常。虽然自从使用ARC后,由于对象释放产生的异常已经大大变少,但偶尔还会出现。开启僵尸对象模式后,就能快速定位到异常位置。开启方式如下:Product–>Scheme–>Edit Scheme. 勾选Enable Zombie Objects即可。

6. lldb命令

  1. Xcode中使用llvm编译器,公认为最好的C、C++、OC、Swift编译器。而lldb是llvm中的调试器,我们可以使用一些简单的命令进行调试
  2. 断点调试中,使用po命令、print命令在Console控制台打印出变量信息。

7. 生命周期方法 init,dealloc

  1. 一般项目都要创建一个基类,封装一些公共的东西,比如:BaseViewController
  2. 可以在这个方法中重写dealloc,可以看到当ViewController退出的时候某个对象是否release。

     -(void)dealloc{
         NSLog(@"%@控制器已死!!!!",[self class]);
     }
    

8. NSLog打印

  1. 使用宏做了部分优化,能够打印出所在类名、所在方法名、详细时间、行号。

     //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. 视图调试

  1. 如今iOS开发的UI设计有很多种方式,比如storyboard,xib,代码实现。对于stoayboard,xib可视化实现是比较简单的,但是对于一些“iOS老程序员”而言,都喜欢使用代码实现UI,并且可能UI层次还比较复杂。这样就给我们新接手项目的开发者带来很多困扰。如何快速查看一个复杂UI的界面层次和布局,最快的方法就是用到视图调试。
  2. 进入试图调试,你可以很方便的查看这个界面。这里可以看到控件之间的层次关系。
  3. 左侧的树形层次图可以在查看线程、队列和UI之间切换:
  4. 如下图:

    图1

10. analyze与Profile (instruments)

  1. Product-> analyze
    1. analyze可以快速的发现你的代码中release的问题,以及继承过程中的父类方法缺失等等问题
  2. Product-> Profile(instrument)
    1. instrument里面包含了很多工具,内存溢出分析,性能分析,各种分析……
    2. 其中leaks是专用debug的内存溢出分析工具
    3. leaks略讲(网上很多)
Table of Contents