静态方法的宏日志使用问题

时间:2014-04-22 15:25:59

标签: ios objective-c

我编写了定义日志级别的宏并打印出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

如何在静态方法中使用它?

谢谢,

2 个答案:

答案 0 :(得分:1)

这不是一种静态方法;它是一个功能。 _cmd变量仅存在于方法中(因为只有方法由选择器调用)。如果您希望这在函数和方法中都有效,那么您必须使用__FUNCTION____PRETTY_FUNCTION__,它们都是C字符串。

答案 1 :(得分:1)

您希望以NSAssert的方式解决此问题。也就是说,NSCAssert可以避免使用_cmdself。然后,您将在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