tl;博士
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
详情
Apple 有一个技术问答页面:QA1669 - How can I add context information - such as the current method or line number - to my logging statements?
协助记录:
- C 预处理器提供了一些宏。
- Objective-C 提供表达式(方法)。
正如其他答案所示,仅获取当前方法的名称,调用:
NSStringFromSelector(_cmd)
要获取当前方法名称和当前行号,请使用这两个宏__func__ 和__LINE__,如下所示:
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);
另一个例子……我保存在 Xcode 代码片段库中的代码片段:
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
...和 TRACE 而不是 ERROR...
NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
…还有一个更长的使用软编码描述传递值 ([rows count])…
NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"'Table of Contents.txt' file's count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );
用于日志记录的预处理器宏
注意在宏的两边使用一对下划线字符。
|宏 |格式 |描述
__func__ %s 当前函数签名
__LINE__ %d 当前行号
__FILE__ %s 源文件的完整路径
__PRETTY_FUNCTION__ %s 与 __func__ 类似,但包含详细信息
C++ 代码中的类型信息。
记录表达式
|表达 |格式 |描述
NSStringFromSelector(_cmd) %@ 当前选择器的名称
NSStringFromClass([self class]) %@ 当前对象的类名
[[NSString %@源代码文件名
stringWithUTF8String:__FILE__]
最后路径组件]
[NSThread callStackSymbols] %@ NSArray 的堆栈跟踪
日志框架
一些日志框架也可能有助于获取当前方法或行号。我不确定,因为我在 Java (SLF4J + LogBack) 中使用了一个很棒的日志框架,但不是 Cocoa。
有关各种 Cocoa 日志框架的链接,请参阅 this question。
选择器名称
如果您有一个 Selector 变量(SEL),您可以按照此 Codec blog post: 描述的两种方式之一打印其方法名称(“消息”): p>
- 使用 Objective-C 调用 NSStringFromSelector:
NSLog(@"%@", NSStringFromSelector(selector) );
- 使用直 C:
NSLog(@"%s", selector );
此信息取自截至 2013 年 7 月 19 日的链接 Apple 文档页面。该页面上次更新时间为 2011 年 10 月 4 日。