Xcode 调试(一)

2016-03-23  本文已影响77人  comst

Xcode 调试(一)

工欲善其事,必先利其器 。对于软件开发而言,调试是必须学会的技能,重要性不言而喻。今天总结一下自己在iOS开发中使用的调试技巧。

普通断点

断点是调试中必备的技巧。当程序运行到断点处时会暂停执行,这个时候可也去查看程序当前的某些变量的值。只要在代码旁边点击,就能添加一个断点,再次点击,就能让断点不可用,拖动断点一段距离可以删除断点。在某行创建断点的是 command + \,如图


还可以为断点添加动作,让断点在暂停的时候执行一些操作,不如输出日志,播放一段声音等。
异常断点

iOS开发过程中,如果我们因为异常然后程序崩了,这个时候断点会跑到main函数中去。如果设置了异常断点,当程序异常退出的时候回停在引起异常的代码处。


符号断点

符号断点的创建也同异常断点。 一一般符号断点可以在你指定的[reciever message]时中断执行。

LLDB命令,最常用的打印命令 po
NSLog打印

NSLog是我最常用的调试手法,简单易用,如下代码可以打印出行号,文件等信息。
define NSLog(format, ...) do {
fprintf(stderr, "<%s : %d> %s\n",
[[[NSString stringWithUTF8String:FILE] lastPathComponent] UTF8String],
LINE, func);
(NSLog)((format), ##VA_ARGS);
fprintf(stderr, "-------\n");
} while (0)

对象的dealloc

要判断一个对象有没有被释放最简单的方法就是重写该对象的deaaloc方法,在里面打印一些信息。

查看代码的运行时间

有时候我们想要知道某段代、某个循环的执行时间,然后分析下效率。可以使用了下列的宏,原理非常简单,就是使用NSDate计算前后的时间差。
define TICK NSDate *startTime = [NSDate date]
define TOCK NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])

手机截屏

当你想给你的运行在真机上app截屏的时候,可以使用Xcode,具体步骤Debug-->View Debugging-->Take Screenshot然后图片就出现在桌面了。

viewDidLoad不要写太多代码

个人建议不要在viewDidLoad方法中写入太多代码。尤其是涉及该界面中的动画的时候,因为执行viewDidLoad方法的时候,界面可能还没完全加载出来,如果此时把动画放在viewDidLoad中,可能会造成动画无法显示。当然也不建议把耗时的网络请求和动画效果都放在viewDidLoad中,界面的阻塞也会造成动画无法显示。可以尝试把动画放在viewDidAppear,viewWillAppear方法中。对于这类涉及UI的问题,调试也是比较麻烦的。。。

常用的编译宏定义

__OPTIMIZE__ :用于release和debug的判断
#ifdef OPTIMIZE
NSLog(@"release");
#else
NSLog(@"debug");
#endif
__i386____x86_64__ :用于模拟器和真机环境的判断
if defined (i386) || (x86_64)
NSLog(@"模拟器");
else
NSLog(@"真机");
endif
__IPHONE_OS_VERSION_MAX_ALLOWED : 当前编译的SDK版本,可以与__IPHONE_9_0等宏定义进行比较,进行不同版本下代码的执行
if (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_9_0) {
//如果当前SDK版本为9.0是执行这里的代码
}else{
//否则执行这里
}

上一篇下一篇

猜你喜欢

热点阅读