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