クラスで 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 によって標準で定義されているため、これには構成は必要ありません。これにより、以下が提供されます。
また、ログはきれいに出力され、ログが出力されたクラスとメソッドを示しています。