vod*_*ang 147 c iphone debugging objective-c
目前,我们正在定义一个扩展日志机制来打印出日志的类名和源行号.
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
__LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
Run Code Online (Sandbox Code Playgroud)
例如,当我调用NCLog(@"Hello world")时; 输出将是:
<ApplicationDelegate:10>Hello world
Run Code Online (Sandbox Code Playgroud)
现在我还想注销方法名称,如:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Run Code Online (Sandbox Code Playgroud)
因此,当我们知道调用哪种方法时,这将使我们的调试变得更容易.我知道我们也有Xcode调试器,但有时候,我也希望通过注销来进行调试.
dra*_*ard 255
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
Run Code Online (Sandbox Code Playgroud)
斯威夫特3及以上
print(#function)
Run Code Online (Sandbox Code Playgroud)
Dav*_*ong 158
要从技术上回答您的问题,您需要:
NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);
Run Code Online (Sandbox Code Playgroud)
或者您也可以这样做:
NSLog(@"%s", __PRETTY_FUNCTION__);
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 79
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
Run Code Online (Sandbox Code Playgroud)
Apple有一个技术问答页面:QA1669 - 如何在我的日志记录语句中添加上下文信息(例如当前方法或行号)?
协助记录:
_cmd正如其他答案所示,仅仅获取当前方法的名称,请致电:
NSStringFromSelector(_cmd)
Run Code Online (Sandbox Code Playgroud)
要获取当前方法名称和当前行号,请使用这两个宏__func__,__LINE__如下所示:
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);
Run Code Online (Sandbox Code Playgroud)
另一个例子......我在Xcode的代码片段库中保存的代码片段:
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
Run Code Online (Sandbox Code Playgroud)
......和TRACE而不是ERROR ......
NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
Run Code Online (Sandbox Code Playgroud)
...以及使用软编码描述传递值([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__ );
Run Code Online (Sandbox Code Playgroud)
请注意在宏的两侧使用一对下划线字符.
| 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 + LogBack)而不是Cocoa.
有关各种Cocoa日志框架的链接,请参阅此问题.
如果您有一个Selector变量(SEL),您可以按照此Codec 博客文章所描述的两种方式之一打印其方法名称("message"):
NSLog(@"%@", NSStringFromSelector(selector) );NSLog(@"%s", selector );此信息来自链接的Apple文档页面,截至2013-07-19.该页面最后更新2011-10-04.
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56468 次 |
| 最近记录: |