NSLogをデバッグ中に有効にし、そうでない場合は無効にします。非常に簡単なことは次のとおりです。
#ifdef DEBUG
NSLog(@"My log");
#endif
しかし、このすべて#ifdef
および#endif
はつまらない... :(だから私は他のことを試してみてください:(。pchはそれを置くのに適した場所です)
#ifdef DEBUG
# define NSLog(text) NSLog(text);
#else
# define NSLog(text)
#endif
これは非常にうまく機能します(再帰的ではありません)。しかし、問題はNSLogの引数が無限であることです。
void NSLog(NSString *format, ...)
プリプロセッサモードで動作するようにこれをどのように解決しますか?
-編集-
このコードはNSLogを改善します。
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif
これはトリックを行う必要があります:
#ifdef DEBUG
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) (void)0
#endif
これは少し短く、デバイスを使用するときにNSLogを無効にします。ゲームを書いている場合、NSLogを頻繁に送信すると、FPSが60から20に低下する可能性があります。
#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
#define NSLog(...)
#endif
上記の答えはすべて正しいです。また、次の方法で行うことをお勧めします。括弧のないifステートメントがあると仮定します
if(x==5)
NSLog("x is 5");
NSLogをステートメントなしで置き換えるとどうなりますか。したがって、単純に空のループに置き換えることができます。
#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) do {} while (0)
#endif
このステートメントは、空のループを1回実行します。これにより、すべてのライブコードからNSLogが安全に削除されます。
#ifndef Debug
#define Debug 1
#endif
#if Debug
# define DebugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DebugLog(...)
#endif
ログを有効にするにはデバッグを1に、無効にするには0に設定します。
ここに素敵なトリックがあります...任意の.mに追加します
#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog
交換する
NSLog(@"????");
と
EXTRANSLog(@"????");
この例では、NSUserキーを作成し、BOOLをYESに設定し、何らかの形式のスイッチなどを使用してキーをNOに変更するか、コンソールデバッガーでEXTRANSLogを表示したくない場合は完全に削除します。
トラブルシューティング時にこれを使用し、すべての過剰なログを表示したくない。 SomeFancyKey == YESの場合のみ。
これはと同じです
#define NSLog if(1) NSLog
1はYES、NSLogを表示し、0はNOを示します。