在进行IOS编程的过程中,中会遇到这样一个问题:如果在代码中写了很多NSLog()函数,来确定程序的运行进程,当项目越写越大,因NSLog带来的末端输出信息会越来越多,这是已经很不难分清每个 NSLog函数在程序的那个位置了。因此,如果末端的输出信息中包含了这个NSLog()所在的上下文信息,比如那个文件中的哪个方法调用的,在哪一行等等,这样就很明了了。
其实,C预处理器提供了很多关于当前文件、行号或者功能信息的标准宏。而且,OC中的隐含参数_cmd会给出当前选择的方法等信息,如果在你的NSLog()中加入这些信息,对于你调试或者错误处理一定能提供有益的参考。
下面把最常用的宏和表达式写出来说明
上面两张图是我从苹果开发文档上截取的图
英文已经讲的很详细了,下面我演示一下上面几个函数的用法
- (void)viewDidLoad
{
[super viewDidLoad];
// [self addAView];
// [self addAButton];
NSMutableArray * array = [[NSMutableArray alloc]initWithCapacity:0];
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, array);
[array addObject:@"iOS"];
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, array);
}
运行后控制台打印的结果为:
2014-01-23 15:55:40.814 test[2994:70b] -[ViewController viewDidLoad]:24 someObject=(
)
2014-01-23 15:55:40.815 test[2994:70b] -[ViewController viewDidLoad]:26 someObject=(
iOS
)
NSLog(@"\n%s",__FILE__);
/Users/****/Desktop/文件夹名称/test/test/ViewController.m
NSLog(@"\n%@",[[NSStringstringWithUTF8String:__FILE__]lastPathComponent]);
ViewController.m
下面说一下我项目中的使用:
在应用的****-Prefix.pch文件中有如下代码
//这个宏是得出这段代码做对应的.m文件
#define DEBUG_FILENAME [[[NSString stringWithUTF8String:__FILE__]
componentsSeparatedByString:@"/"] lastObject]
//DEBUG_NEW_FMT(fmt) 这个宏是得到fmt这个对象所处的在哪个.m文件下的哪个函数,并处在这个.m文件的第几行
#define DEBUG_NEW_FMT(fmt) \
[NSString stringWithFormat:@"%s(%@:%d) %@", \
__FUNCTION__, \
DEBUG_FILENAME, \
__LINE__, \
fmt]
//##__VA_ARGS__ 也是一个宏(#define Macro(...) __VA_ARGS__),他的作用是支持可变参数,被省略的参数会被扩展成空串,作用和上面一样,只是重新定义了NSLog()
#define DLog(fmt, ...) NSLog(DEBUG_NEW_FMT(fmt), ##__VA_ARGS__)
//打印空日志,参数0为了消除编译器的警告
#define DEBUG_LOG_NULL NSLog(DEBUG_NEW_FMT(@""),0)
//打印一个变量
#define DEBUG_LOG_VALUE(x, fmt) do { \
DEBUG_LOG(@#x " = " #fmt, x); \
} while(0)