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

如其他答案所示,只需要获取当前方法的名称,请致电:

 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()”