软件开发工作,调试是必备技能,重要性不多说。而调试方法在不同的平台和语言中大部分都是可以互相迁移借鉴的。不同语言、不同IDE、不同平台的调试,有同性也有个性。本人iOS开发,语言就用OC,IDE就用Xcode,来唠唠开发调试
一、NSLog打印
NSLog打印是最常用的调试方法,也是初学者最喜欢最简单的调试方法,通过打印信息来查看运行路径和数据等。但打印出的信息比较少,NSLog本身效率也较低,但也不失为一种方法。用下面的宏做NSLog的优化,可以打印类名、所在方法名、详细时间和行号等信息。
#define TJLog(format, ...) do { \
fprintf(stderr,"<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr,"-------\n"); \
} while (0)
二、生命周期方法init、dealloc
在ViewController中,有两个生命周期方法我们可以重写,也就是init、dealloc方法。对于监听某些对象的状态很有帮助,特别是在dealloc方法中查看当ViewController退出的时候某个对象有没有release掉。这里也没有啥代码,自己视情况而定。
三、查看代码运行时间
有时候需要做代码优化或者耗时操作,分析效率问题,就需要知道代码的执行时间长短。网上看了看资料,直接使用宏就行
#define CODE_START NSDate *startTime = [NSDate date]
#define CODE_END NSLog(@"Time:%f",-[startTime timeIntervalSinceNow])
//用法
CODE_START;
//放置被监测代码
CODE_END;
控制台打印:
四、僵尸对象
iOS中把release完但却没有完全消失的对象叫做僵尸对象,这时若再次释放,就会出现异常。苹果对此优化后的ARC对这种情况做了很多优化处理,但偶尔难免还是会出现。开启僵尸对象监听模式后,可以快速定位异常位置,便于我们快速调试。方法:Product–>Scheme–>Edit Scheme. 勾选Enable Zombie Objects即可。
五、Analyze分析器
Analyze分析器是一种静态分析工具,可以对当前程序进行静态分析,找出未使用的变量或一些死储存等等。方法:Product–>Analyze.然后就是慢慢等它分析完,如下蓝色的标记就是静态分析的结果。
六、断点
1.普通断点
断点(Breakpoint)绝对是调试程序的第一大选择,也是有一个基础调试技能。断点打在哪儿当程序运行至此时就会暂停到这里(这一行未被执行)。
点击数字行数就在此行添加断点,再点击一次则取消(还有颜色,但不起断点作用了,可能是提醒你曾经在这里打过断点),调试中还能在下方调试信息区看到参数的值:
2.条件断点
上面是最普通的断点使用方法,我们还能对断点的属性进行配置,设置条件,让断点更智能化
点击Edit Breadpoint…就是进入条件断点,以下面代码为例
-(void)test{
for (int i = 0;i < 5; i++){
NSLog(@"我的值:%d",i);
}
}
我并不想每次循环都有断点,只有在为3时需要,则条件如下:
也可以查看某个方法被调用的次数,设置Action参数如下,注:要选中Automatically continue after evaluating actions。
控制台输入如下:
七、异常断点
断点功能不止于上面所述,iOS开发者都遇到过,我们程序因为异常而crash代码就直接跑到main函数了。很多时候开发者不知道从何下手,下面就是讲用异常断点来让代码终止在出现异常的那一行 添加异常断点:
若有异常则会出现下面图样的情况,点击进行查看:
1.符号断点 Symbolic Breakpoint
创建方法跟异常断点一样,符号断点可以在指定的类名或者方法名中执行异常中断
配置符号断点如下:假如需要在执行到ViewController类的viewDidLoad方法时执行中断。
如果你的Symbol只写了一个函数名,那么就会在出现该函数名的地方就中断执行。如下,就会在运行到doAnimation的时候中断
以上就是跟大家分享的调试经验啦!