NS在iPhone中使用objective-C来logging方法名称
目前,我们正在定义一个扩展的日志机制来打印日志的类名和源行号。
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \ __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
例如,当我调用NCLog(@“Hello world”); 输出将是:
<ApplicationDelegate:10>Hello world
现在我也想注销方法名称,如:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
所以,当我们知道哪个方法被调用时,这会使我们的debugging变得更容易。 我知道我们也有XCodedebugging器,但有时我也想通过注销来进行debugging。
print(__FUNCTION__) // Swift NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
斯威夫特3及以上
print(#function)
要从技术上解答您的问题,您需要:
NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);
或者你也可以这样做:
NSLog(@"%s", __PRETTY_FUNCTION__);
TL;博士
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
细节
Apple有一个技术问答页面: QA1669 – 如何将上下文信息(如当前方法或行号)添加到我的日志logging?
为了帮助logging:
- C预处理器提供了一些macros 。
- Objective-C提供expression式 (方法)。
- 传递当前方法select器的隐式参数 :
_cmd
- 传递当前方法select器的隐式参数 :
如其他答案所示,只需要获取当前方法的名称,请致电:
NSStringFromSelector(_cmd)
要获取当前方法名称和当前行号,请使用这两个macros__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__ );
用于logging的预处理器macros
请注意在macros的两边使用一对下划线字符。
| macros| 格式| 描述 __func__%s当前函数签名 __LINE__%d当前行号 __FILE__%s源文件的完整path __PRETTY_FUNCTION__%s像__func__,但包含详细信息 在C ++代码中input信息。
expression式logging
| expression式| 格式| 描述 NSStringFromSelector(_cmd)%@当前select器的名称 NSStringFromClass([self class])%@当前对象的类名 [[NSString%@源代码文件名 stringWithUTF8String:__ FILE__] lastPathComponent] [NSThread callStackSymbols]%@堆栈跟踪的NSArray
logging框架
一些日志logging框架也可能有助于获取当前的方法或行号。 我不确定,因为我已经在Java( SLF4J + LogBack )中使用了一个伟大的日志框架,但不是Cocoa。
看到这个问题的链接到各种cocoa日志框架。
select器的名称
如果你有一个Selectorvariables(一个SEL ),你可以按照这个编解码器 博客文章所描述的两种方式来打印它的方法名(“message”):
- 使用Objective-C调用NSStringFromSelector :
NSLog(@"%@", NSStringFromSelector(selector) );
- 使用直C:
NSLog(@"%s", selector );
此信息从2013-07-19链接的Apple文档页面中提取。 该页面最近更新了2011-10-04。
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C print(__FUNCTION__) // Swift
其实就像以下这样简单:
printf(_cmd);
出于某种原因,iOS允许将_cmd作为字符型字符传递,甚至没有编译警告。 谁知道
在Swift 4:
func test(){
print(#function)
}
testing()//打印值“test()”