我正在做一个关于在Xcode中调试的演示,想要获得更多关于有效使用NSLog的信息。

我特别想问两个问题:

是否有一种方法可以轻松地NSLog当前方法的名称/行号? 在编译发布代码之前,是否有一种方法可以轻松地“禁用”所有nslog ?


当前回答

禁用所有nslog,对于那些对MACROS过敏的人,这里有一些东西你也可以编译:

void SJLog(NSString *format,...)
{
    if(LOG)
    {   
        va_list args;
        va_start(args,format);
        NSLogv(format, args);
        va_end(args);
    }
}

并且,像NSLog一样使用它:

SJLog(@"bye bye NSLogs !");

来自这个博客:https://whackylabs.com/logging/ios/2011/01/19/ios-moving-in-and-out-of-nslogs/

其他回答

我已经从上面取了DLog和ALog,并添加了ULog,它会引发一个UIAlertView消息。

总结:

只有当DEBUG变量被设置时,DLog才会像NSLog一样输出 ALog总是像NSLog一样输出 只有当DEBUG变量被设置时,ULog才显示UIAlertView

#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DLog(...)
#endif
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#ifdef DEBUG
#   define ULog(fmt, ...)  { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%s\n [Line %d] ", __PRETTY_FUNCTION__, __LINE__] message:[NSString stringWithFormat:fmt, ##__VA_ARGS__]  delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; }
#else
#   define ULog(...)
#endif

这是它的样子:

+ 1 Diederik

新增的DLog。而不是完全删除调试从发布的应用程序,只是禁用它。当用户有问题需要调试时,只需告知如何在发布的应用程序中启用调试,并通过电子邮件请求日志数据。

简短版本:创建全局变量(是的,懒惰和简单的解决方案),并修改DLog如下所示:

BOOL myDebugEnabled = FALSE;
#define DLog(fmt, ...) if (myDebugEnabled) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

更长的答案在joromus iLessons iLearned:如何在发布的应用程序中进行动态调试日志记录

禁用所有nslog,对于那些对MACROS过敏的人,这里有一些东西你也可以编译:

void SJLog(NSString *format,...)
{
    if(LOG)
    {   
        va_list args;
        va_start(args,format);
        NSLogv(format, args);
        va_end(args);
    }
}

并且,像NSLog一样使用它:

SJLog(@"bye bye NSLogs !");

来自这个博客:https://whackylabs.com/logging/ios/2011/01/19/ios-moving-in-and-out-of-nslogs/

我对这个问题的回答可能会有所帮助,看起来它与Diederik编造的答案相似。你可能还想用你自己的自定义日志类的静态实例替换NSLog()的调用,这样你就可以为调试/警告/错误消息添加一个优先级标志,将消息发送到文件或数据库以及控制台,或者几乎任何你能想到的东西。

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, 
              [[NSString stringWithUTF8String:__FILE__] lastPathComponent], 
              __LINE__, 
              [NSString stringWithFormat:(s), 
              ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

更改现有nslog以显示调用它们的行号和类是很容易的。在前缀文件中添加一行代码:

#define NSLog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)