我希望能够在我的类中包装对 NSLog 的所有调用,这样我就可以在一个地方启用/禁用日志记录。
我不知道如何为我的方法接受可变数量的参数,然后将它们交给 NSLog。
请举例。
我希望能够在我的类中包装对 NSLog 的所有调用,这样我就可以在一个地方启用/禁用日志记录。
我不知道如何为我的方法接受可变数量的参数,然后将它们交给 NSLog。
请举例。
对于记录器,我只会使用宏
#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 函数与变量参数交互
日志记录的演示
#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);
}
}
我使用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 定义为标准。这提供了:
并且日志打印得很漂亮 - 显示发出日志的类和方法。