Xcode 调试(一)
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{
//否则执行这里
}