1

我希望能够在我的类中包装对 NSLog 的所有调用,这样我就可以在一个地方启用/禁用日志记录。

我不知道如何为我的方法接受可变数量的参数,然后将它们交给 NSLog。

请举例。

4

2 回答 2

4

对于记录器,我只会使用宏

#if DEBUG
#warning LOGGING ENABLED
#define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else
#define DebugLog(...)

#endif

如果您想使用可变参数:

声明您的方法,使其接受可变数量的参数

+ (id)stringWithFormat:(NSString *)format, ...;

使用 va_* C 函数与变量参数交互

  • va_start - 初始化一个 va_list
  • va_arg - 从列表中获取下一个参数。
  • va_end - 通过 vas 列表释放任何内存

日志记录的演示

#import <Foundation/Foundation.h>

#define DEBUG 1

#if DEBUG
#warning LOGGING ENABLED
#define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else
#define DebugLog(...)

#endif

int main(int argc, char *argv[]) {
    @autoreleasepool {
                    id v = @1;
        DebugLog(@"bla: %@", v);        
    }
}
于 2013-09-23T15:51:29.727 回答
2

我使用Marcus Zarra提供的一组方便的宏:

#ifdef DEBUG
  #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
  #define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]
#else
  #define DLog(...) do { } while (0)
  #ifndef NS_BLOCK_ASSERTIONS
    #define NS_BLOCK_ASSERTIONS
  #endif
  #define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#endif

#define ZAssert(condition, ...) do { if (!(condition)) { ALog(__VA_ARGS__); }} while(0)

这不需要任何配置,因为 DEBUG 和 RELEASE 由 Xcode 定义为标准。这提供了:

  • DLog() 仅在 DEBUG 中发出 NSLog
  • ALog() 在 DEBUG 中抛出一个带有消息的断言,并在 RELEASE 中发出一个 NSLog
  • ZAssert() 如果条件在 DEBUG 中失败,则抛出断言,如果条件在 RELEASE 中失败,则发出 NSLog。

并且日志打印得很漂亮 - 显示发出日志的类和方法。

于 2013-09-24T11:47:50.120 回答