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 で条件が失敗した場合は Assertion をスローし、RELEASE で条件が失敗した場合は NSLog を発行します。

また、ログはきれいに出力され、ログが出力されたクラスとメソッドを示しています。

于 2013-09-24T11:47:50.120 に答える