在 iPhone 中使用 Objective-C 记录方法名称

目前,我们正在为自己定义一个扩展的日志机制,以打印出类名和日志的源代码行号。

#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

因此,当我们能够知道调用哪个方法时,这将使我们的调试变得更加容易。我知道我们也有 Xcode 调试器,但是有时候,我也想通过注销来进行调试。

61887 次浏览
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

Swift 3及以上

print(#function)

为了从技术上回答你的问题,你需要:

NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

或者你也可以这样做:

NSLog(@"%s", __PRETTY_FUNCTION__);

博士

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

细节

苹果有一个技术问答页面: QA1669-如何将上下文信息(如当前方法或行号)添加到日志语句中?

协助伐木:

  • C 预处理器提供了一些
  • 目标-C 提供 表情(方法)。
    • 为当前方法的选择器传递 隐式论点: _cmd

正如其他答案所指出的,要仅仅获取当前方法的名称,请调用:

NSStringFromSelector(_cmd)

要获得当前方法名 还有当前行号,使用这两个宏 __func____LINE__,如下所示:

NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

另一个例子... ... 我保存在 Xcode 代码片段库中的代码片段:

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

追踪而不是错误。

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__ );

用于日志记录的预处理宏

注意在宏的两边都使用了 一对下划线字符。

| Macro                | Format   | Description
__func__               %s         Current function signature
__LINE__               %d         Current line number
__FILE__               %s         Full path to source file
__PRETTY_FUNCTION__    %s         Like __func__, but includes verbose
type information in C++ code.

日志记录表达式

| Expression                       | Format   | Description
NSStringFromSelector(_cmd)         %@         Name of the current selector
NSStringFromClass([self class])    %@         Current object's class name
[[NSString                         %@         Source code file name
stringWithUTF8String:__FILE__]
lastPathComponent]
[NSThread callStackSymbols]        %@         NSArray of stack trace

日志框架

一些日志框架也可以帮助获得当前的方法或行号。我不确定,因为我在 Java (SLF4J + 日志返回)中使用了一个很棒的日志框架,但是没有使用 Cocoa。

有关各种 Cocoa 日志框架的链接,请参见 这个问题

选择器名称

如果您有一个 Selector 变量(一个 SEL) ,您可以按照 解码器 博客文章所描述的两种方式中的任意一种来打印它的方法名称(“ message”) :

  • 使用 Objective-C 对 NSStringFromSelector的调用:
    NSLog(@"%@", NSStringFromSelector(selector) );
  • 使用直 C:
    NSLog(@"%s", selector );

这些信息来自于2013-07-19年的苹果文档链接页面。该页面上次更新是在2011-10-04年。

NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift

其实很简单:

printf(_cmd);

由于某些原因,iOS 允许将 _ cmd 作为一个文本字符传递,甚至没有编译警告。谁知道呢

雨燕4:

函数测试(){

print(#function)

}

Test ()//打印值“ test ()”