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

我特别想问两个问题:

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


当前回答

我已经从上面取了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

其他回答

为了补充上面的答案,在某些情况下使用NSLog的替代品是非常有用的,尤其是在调试的时候。例如,删除每行上的所有日期和进程名称/id信息可以使输出更具可读性和更快地启动。

下面的链接提供了很多有用的方法,可以使简单的日志记录变得更好。

http://cocoaheads.byu.edu/wiki/a-different-nslog

NSLog(@"%s %d %s %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);

输出文件名,行号和函数名:

/proj/cocoa/cdcli/cdcli.m 121 managedObjectContext managedObjectContext

__FUNCTION__在c++中显示的是一个混乱的名字。__PRETTY_FUNCTION__显示的是一个很好的函数名,在cocoa中它们看起来是一样的。

我不确定什么是禁用NSLog的正确方法,我做了:

#define NSLog

并且没有日志输出显示,但是我不知道这是否有任何副作用。

这是一个没有答案的新把戏。你可以用printf代替NSLog。这将给你一个干净的日志:

使用NSLog,你会得到这样的东西:

2011-11-03 13:43:55.632 myApp[3739:207] Hello Word

但是用printf你只能得到:

Hello World

使用这段代码

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...) {}              
#endif

我已经从上面取了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

这很简单,举个例子

-(void) applicationwillenter前台:(UIApplication *)application { NSLog(@“% s”,__PRETTY_FUNCTION__); }

输出: - - - - - - [AppDelegate applicationWillEnterForeground:]