NSLog替换的演变

我的上一篇关于条件日志的文章收到了相当一部分的回复,部分人指出#ifdef DEBUG语句影响美观而且容易出错,Karl Kraft就说到创建一个新的DebugLog类来替代NSLog。

至今NSLog出来很长一段时间了,现在有很多这个问题的解决方案。

CocoaDev建议用这些宏:

#if MY_DEBUG_FLAG
#define DEBUG_OUTPUT( a )         NSLog( a )
#define DEBUG_OUTPUT1( a, b )     NSLog( a, b )
#else
#define DEBUG_OUTPUT( a )         // (a)
#define DEBUG_OUTPUT1( a, b )     // (a,b)
#endif

列出所有 参数数量 不同的变体宏似乎有点乏味,所以通过 objective - c 2.0C99您可以使用可变参数的宏:

#define DEBUG_OUTPUT(fmt, ...) NSLog(fmt, ## __VA_ARGS__)
就如 Fraser Hess在Dropping NSLog in release builds里面所描述的,你可以将它放在你的<应用名>_Prefix.pch 文件中;

#ifdef DEBUG
#    define DLog(...) NSLog(__VA_ARGS__)
#else
#    define DLog(...) /* */
#endif
#define ALog(...) NSLog(__VA_ARGS__)

在使用ALog的情况下,无论DEBUG标记的状态是什么,日志总是会在你想要的地方打印,我比较偏好这种预处理宏的方法,因为你不用在你的整个工程随时随地导入额外的类,只需在你工程的一个文件粘贴几行代码就可以了。

但是我觉得还可以再将它改进一下。

内置的宏__PRETTY_FUNCTION__还是相当不错的,它会输出当前的类名和方法名。

Mark Damon Huges在他的Cocoa logging宏中就使用了它:

#ifdef DEBUG
// DLOG takes a format argument (which must begin %s) and 0 or more args:
// DLOG(@"%s");
// DLOG(@"%s: %d", x);
#define DLOG(fmt, ...) NSLog(fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#define DLOG(...)
#endif

这个宏有一个缺点就是,它需要 在你所有的日志语句中添加一个"%s",例如DLog(@"%s foo");而不是NSLog(@“foo”);所以它并不是NSLog替代。

那我们来修改一下。

#define DLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__);
现在你可以使用DLog (@”foo”);以及像DLog(@”value: %d”, x)这样传值。

最后一步就是添加行号了。

#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
现在如果嫌麻烦的你,想知道具体执行到特定到一行,只需使用DLog就行了。

好了,现在列出这个宏的完整内容:

// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
#	define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#	define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

前面讲的那样设置好DEBUG变量。(译者:Xcode5参见:http://blog.csdn.net/assholeu/article/details/32831981

我相信这还可以再改进,集思广益。


转载请注明出处(http://blog.csdn.net/assholeu/article/details/32796537

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值