在我们iOS开发过程中,改BUG的时间甚至超过了写功能代码的时间。如何在程序代码出错时,精准定位到有问题的代码位置呢?首先我们要开启Xcode自带的全局崩溃断点All Exceptions,其次就需要灵活地使用NSLog打印功能。当然,这里不是指简单系统方法NSlog,而是指加入了行数/方法名/路径的复合打印内容。
打印行数
LINE %d 当前源码文件中的行号
打印当前函数方法名
func %s 打印当前函数名
打印当前所在路径
FILE %s 当前源码文件完整路径
我们把上述常用于打印的元素整合在一起写成一个宏定义。
#define NSLog(FORMAT, ...) fprintf(stderr,"[%s:%d行:%s] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __func__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
例如,我们在WebsiteViewController.m文件中的viewDidLoad方法中第48行打印一下当前模拟器的屏幕高度。打印结果分别对应我们上面的NSLog宏定义中的当前源码文件路径WebsiteViewController.m,当前源码文件中的行号48行,当前函数名[WebsiteViewController viewDidLoad]。【注意】开发过程中,警察会碰到某一个接口返回的数据量特别庞大的情况,而Xcode本身的打印数据量是有一定限度的。
【解决方案】在我们的.pch文件中添加另一个宏定义,在需要打印大量数据的地方使用MyLog打印数据即可。
#define MyLog(FORMAT, ...) fprintf(stderr, "%s:%zd\t%s\n", [[[NSString stringWithUTF8String: __FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat: FORMAT, ## __VA_ARGS__] UTF8String]);