2

NSLog のラッピングの例を見たことがありますが、詳細については 100% 確信が持てません。

例えば#define debugLog(fmt,...) NSLog(@"%@",[NSString stringWithFormat:(fmt), ##__VA_ARGS__]);

ここでの議論は正確には何ですか?

次のようなログに定数文字列を追加したい場合

- (void) logMessage:(NSString *) message ofType:(NSString *) type
{

    NSLog(@"%@ - %@", type, message);
}

#define マクロでこれを作成するにはどうすればよいですか?

4

1 に答える 1

4

debugLog可変長マクロ (可変数の引数を取るマクロ) です。特定のマクロはNSLog2 つの引数を使用して呼び出します。最初の引数は書式文字列 ( ) で、2 番目の引数は、渡された書式文字列とマクロの可変長引数を取る@"%@"によって返される自動解放された文字列です。stringWithFormat

__VA_ARGS__マクロ内で可変引数リストを参照する方法です。...パラメータリストの に対応します。

logMessageメソッドの代わりに、debugLogマクロを使用して同じ結果を得ることができます。

debugLog("%@ - %@", type, message);

NSLogただし、マクロ自体は、他に何も追加せずにラップするだけなので、少し無意味に思えます。

に直接対応するマクロが必要な場合logMessageは、可変長リストをまったく扱う必要はありません。

#define logMessageAsMacro(message, type) NSLog(@"%@ - %@", message, type)

NSStringマクロはタイプセーフではないため、両方の引数が 's であるかどうかに注意する必要があります。

于 2012-10-05T15:13:52.163 に答える