首先我们了解一下C/C++/Objective-C语言提供的宏
iOS— 不一样的NSLog打印
C/C++/Objective-C用于日志输出的预处理宏
Macro | Format Specifier | Description |
---|---|---|
func | %S | 当前函数 |
LINE | %d | 源文件中的行号 |
FILE | %s | 源码文件完整路径 |
PRETTY_FUNCTION | %S | 和func类似,但是在C++代码中包含更多的信息 |
Objective-C中用于日志输出的表达式
Expression | Format | Description |
---|---|---|
NSStringFromSelector(_cmd) | %@ | 当前选择器的名字 |
NSStringFromClass([self class]) | %@ | 当前类对象的名字 |
[[NSString stringWithUTF8String:FILE] lastPathComponent] | %@ | 源码文件的名称 |
[NSThread callStackSymbols] | %@ | 当前栈信心的刻度字符串信息,仅仅用于调试 |
打印当前函数无非就是cmd,func,FUNCTION,__PRETTY_FUNCTION
例子1:打印当前的函数名,以及当前代码所在文件中的行数
NSLog(@"%s, %d", __FUNCTION__, __LINE__);//直接定位到debug的函数名,以及当前代码所在文件中得行数。
在- (void)viewDidLoad中输入以下代码:
打印结果如下:
例子2:打印当前的函数名, NSStringFromSelector 获得参数的选择器所代表的方法的字符串
NSLog(@”%@”, NSStringFromSelector(_cmd));
例子3:打印当前源代码文件全路径
NSLog(@”%s”, _ _ FILE_ _ );
打印结果如下:
例子4:使用_ _ PRETTY_FUNCTION _ _
上面介绍过:像 func,但是包含了C++代码中的隐形类型信息。
打印结果:
在Xcode中:
显然后面func系列要比_cmd好用,相对Objective-C类型内的方法调用,他不仅会显示方法名,还会显示类型,配合LINE,可以精确定位出Log在代码中的位置。