web-dev-qa-db-ja.com

DEBUGモードでNSLogを有効および無効にします

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
54
Rodrigo

これはトリックを行う必要があります:

 #ifdef DEBUG
 #   define NSLog(...) NSLog(__VA_ARGS__)
 #else 
 #   define NSLog(...) (void)0
 #endif
104
JustSid

これは少し短く、デバイスを使用するときにNSLogを無効にします。ゲームを書いている場合、NSLogを頻繁に送信すると、FPSが60から20に低下する可能性があります。

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
    #define NSLog(...)
#endif
19
Aram Kocharyan

上記の答えはすべて正しいです。また、次の方法で行うことをお勧めします。括弧のない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が安全に削除されます。

8
NaXir
#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に設定します。

1
Prashant

ここに素敵なトリックがあります...任意の.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を示します。

1
Canea Rowan