4

アップデート:

詳細については、こちらをご覧ください:

本番コードで NSLog() を使用してはならないというのは本当ですか?

~~~~~~~~~~~~~~~~~~~~~~~~

状況

アプリケーションのより複雑な部分をデバッグするために使用する、かなり厄介な NSLog 呼び出しがいくつかあります。ただし、これらが実行時のパフォーマンスに影響することを最近知りました。

ゴール

Xcode内から実際に製品>実行(別名コマンド-R)を実行していない実行中のNSLog呼び出しを削除したいと思います-特に、これがApp Storeに展開されている場合だけでなく、アプリが Xcode から切断されたとき (つまり、通りを歩いているときにアイコンをタップしただけ)。

提案された解決策?

VIEW_DEBUG のプリプロセッサ マクロを作成したと仮定すると、次の実装は、上記のケースで実行中の NSLog 呼び出しを効果的に削除しますか?

    <bunch of code>

#ifdef VIEW_DEBUG
    NSLog(@"really complex logs entries");
#endif

    <even more code>

これは私にとって「テスト」するのが難しいものなので、より経験豊富な人にアピールしたいと考えました. :)

Xcode の設定(参照用)

xcode設定

4

2 に答える 2

12

一般的な解決策は、Prefix ファイルに次のコードを配置することです (または、必要に応じて専用のクラスと#includeそれを作成することもできます)。

#ifdef DEBUG    
#define DebugLog(...) NSLog(__VA_ARGS__)
#else
#define DebugLog(...) while(0)
#endif

Xcode は、デバッグ ビルドを実行するときに、すでに DEBUG を定義しています (スクリーンショットに示されているように)。VA_ARGSは、 C99 で導入された可変個引数マクロを作成する方法です。これdo/whileにより、DebugLog が何も実行しない場合でも、実質的に同じ構文効果を持つことが保証されます — 無意味なループについて心配する必要はありません。オプティマイザが削除します。

その後、使用するDebugLogのとまったく同じように使用できますNSLog。これは、あなたが提案したことを正確に実行しますが、条件を何千回もVIEW_DEBUGコピーして貼り付ける必要はありません。#ifdef

于 2012-08-26T23:49:39.383 に答える
3

私は常にDLog自分のコードで使用していますが、うまく機能します。

// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

詳細: NSLog の代替品の進化

于 2012-08-27T01:17:05.857 に答える