tl; dr
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
细节
Apple有一个“技术问答”页:QA1669-如何在我的日志记录语句中添加上下文信息(例如当前方法或行号)?
为了协助记录:
- 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__]
lastPathComponent]
[NSThread callStackSymbols]%@堆栈跟踪的NSArray
记录框架
一些日志记录框架也可能有助于获取当前的方法或行号。我不确定,因为我在Java中使用了很棒的日志记录框架(SLF4J + LogBack),但没有使用Cocoa。
请参阅此问题以获取指向各种Cocoa日志记录框架的链接。
选择器名称
如果您有一个Selector变量(SEL),则可以按照此Codec 博客文章中所述的两种方法之一打印其方法名称(“消息”):
- 使用Objective-C调用NSStringFromSelector:
NSLog(@"%@", NSStringFromSelector(selector) );
- 使用直线C:
NSLog(@"%s", selector );
该信息来自于2013-07-19的链接的Apple文档页面。该页面的最新更新时间为2011-10-04。
iPhone
项目中,我实际上是手动执行此操作的。希望看到答案。