我编写了定义日志级别的宏并打印出TAG
+方法名称:
#define NSLogDebug(topic, frmt, ...) \
do{ if(LOG_LEVEL >= 4) \
NSLog( (topic @" : " @"%@" @" : " frmt), \
NSStringFromSelector(_cmd), ##__VA_ARGS__); } while(0)
用法:
#define TAG @"agent_magr"
/* ... */
-(void)registerforDeviceLockNotif
{
NSLogDebug(TAG, @"init");
输出结果为:
Agent[741:907] agent_magr : registerforDeviceLockNotif : init
但它仅适用于非静态方法。
进入如下方法:
static void displayStatusChanged(/* */)
{}
我收到错误:
Use of undeclared identifier '_cmd' Did you mean 'rcmd'?
我想使用__PRETTY_FUNCTION__
:
#define NSLogDebug(topic, frmt, ...) \
do{ if(LOG_LEVEL >= 4) \
NSLog( (topic @" : " @"%s" @" : " frmt), \
__PRETTY_FUNCTION__ , ##__VA_ARGS__); } while(0)
但是这个用参数打印出完整的功能:
Agent[773:907] agent_magr : void displayStatusChanged(CFNotificationCenterRef, void *, CFStringRef, const void *, CFDictionaryRef) : init
如何在静态方法中使用它?
谢谢,
答案 0 :(得分:1)
这不是一种静态方法;它是一个功能。 _cmd
变量仅存在于方法中(因为只有方法由选择器调用)。如果您希望这在函数和方法中都有效,那么您必须使用__FUNCTION__
或__PRETTY_FUNCTION__
,它们都是C字符串。
答案 1 :(得分:1)
您希望以NSAssert
的方式解决此问题。也就是说,NSCAssert
可以避免使用_cmd
或self
。然后,您将在Objective-C函数中使用NSLogDebug
,在C函数中使用NSCLogDebug
。我还建议不要在这里使用NS
命名空间;你以后会混淆自己(或其他人阅读代码)。
查看 NSException.h :
#if !defined(_NSAssertBody)
#define NSAssert(condition, desc, ...) \
do { \
__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
if (!(condition)) { \
[[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
object:self file:[NSString stringWithUTF8String:__FILE__] \
lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
} \
__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
} while(0)
#endif
#if !defined(_NSCAssertBody)
#define NSCAssert(condition, desc, ...) \
do { \
__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
if (!(condition)) { \
[[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \
file:[NSString stringWithUTF8String:__FILE__] \
lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
} \
__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
} while(0)
#endif