1. ホーム
  2. iphone

[解決済み] プロダクションコードでNSLog()を使ってはいけないというのは本当ですか?

2022-04-27 09:38:12

質問

このサイトでも何度か言われたのですが、本当にそうなのか確認したいのです。

私は、NSLog 関数呼び出しを私のコード全体に散りばめることができ、Xcode/gcc が Release/Distribution ビルドの際にそれらの呼び出しを自動的に取り除いてくれると期待していました。

これは使わない方がいいのでしょうか?もしそうなら、経験豊富なObjective-Cプログラマーの間では、どのような代替手段が最も一般的なのでしょうか?

どのように解決するのですか?

プリプロセッサー・マクロは、確かにデバッグに最適です。NSLog()に問題はありませんが、より良い機能を持つ独自のロギング関数を定義するのは簡単です。これは私が使っているもので、ログ文の追跡を容易にするためにファイル名と行番号を含んでいます。

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

私は、この文全体を独自のファイルではなく、プレフィックスヘッダに記述する方が簡単だと思いました。DebugLog を通常の Objective-C オブジェクトと対話させることで、より複雑なロギング システムを構築することができます。たとえば、独自のログファイル(またはデータベース)に書き込み、実行時に設定できる「優先度」引数を含むロギングクラスを作成し、リリースバージョンではデバッグメッセージを表示せず、エラーメッセージを表示するようにできます(これを実行すると DebugLog() や WarningLog() などのクラスを作成することができます)。

あ、あと覚えておいてほしいのは #define DEBUG_MODE は、アプリケーションのさまざまな場所で再利用することができます。例えば、私のアプリケーションでは、ライセンスキーのチェックを無効にして、ある日付より前のものしか実行できないようにするために使用しています。これにより、期間限定の完全な機能を持つベータ版を、最小限の労力で配布することができます。