2

元の質問: iOS アプリケーションの NSLog に代わるログ モジュールは何ですか? 実際に体験したメリットとデメリットを教えてください。

追加のリクエスト 1: サーバーへのログのアップロードにも役立つ TestFlight TFLog を使用しようとしましたが、アプリがバックグラウンドで実行されているときにログを記録する必要がある場合は制限があるようです。ログ ファイルのローリング/圧縮とサーバー アップロードを支援するログ システムは、非常に役立ちます。

追加のリクエスト 2: 一部の人が書いている NSLog のもう 1 つの問題は、アプリを実稼働用に送信するときに Apple がそれを好まないということです。

ありがとう。

4

5 に答える 5

7

関数のファミリは常にありprintfます。これらは一般に よりも高速ですが、オブジェクトの書式指定子NSLogはサポートされていません。%@

最近、私はロギングに優れたLumberjackフレームワークを使用しています。これは非同期であり、コードのパフォーマンスに影響を与えることはありません。また、ログ出力の書式設定のためのカスタマイズ機能も多数あります。

于 2012-11-05T00:27:13.970 に答える
2

独自の NSLog バリアント (完全な代替品) の作成に興味がある場合は、こちらをご覧ください。

独自の NSLog を作成するのではなく、現在の NSLog をカスタマイズしたい場合は、代わりにこのページで概説されているいくつかのトリックを参照してください。

個人的には、redo-NSLog-from-scratch アプローチの方がはるかに制御しやすいので好みです。ただし、実装にはかなりの時間がかかり、適切に機能させるには、可変引数リストとその実装について学ぶ必要があります。これは、va_lists をさまざまな関数に渡したい場合に特に苦痛になります。独自のバージョンを作成する際の便利な機能の 1 つは、好きな場所 (コンソール、または別のログ ファイル) にログを記録する機能をセットアップできることですfprintf

一方、NSLog をその場でカスタマイズしたいだけの場合は、いくつかの便利なコンパイラ マクロ ( など__LINE__, __PRETTY_FUNCTION__) に慣れるだけで済みます。これはより簡単なアプローチであり、あなたが求めているすべてかもしれませんが、独自のローリングほど多くの制御は提供しません.

お役に立てれば!

于 2012-11-05T00:54:16.653 に答える
1

あなたはすでにそれを知っているかもしれませんが、XCodeでデバッグするときはいつでも変数値を見ることができます

これをチェックしてください Xcodeにはウォッチウィンドウがありますか?

于 2012-11-05T00:35:12.940 に答える
1

__FILE__私が知っている最良の代替手段はマクロです。定義済みの C マクロなどで使用できます__PRETTY_FUNCTION__

プロトタイプ

#define MyLog(args...) MyLogImpl(__FILE__,__PRETTY_FUNCTION__,args);

void MyLogImpl(const char *filename, const char *funcPrettyName, NSString *formatStr, ...);

実装

va_start() va_end()、フォーマットを取得できます。フォーマット サポートの不足を補うprintfために、この値を次のように使用します。

NSString *messageStr =  [[NSString alloc] initWithFormat:formatStr arguments:replacingArgumentParameters];

そして、次のような他のデータと一緒に標準メッセージを印刷できます

fprintf(stderr, "%s %s", filename, messageStr);

メッセージ自体だけでなく、MYLog を呼び出していたファイル名も表示されます。

もう 1 つの便利な方法は、メッセージを現在の log_level または実行中の構成に制限することです。

十分な経験を積んでいると思われる場合は、標準の NSLog マクロを再定義することもできます。

于 2012-11-05T01:02:37.667 に答える
0

「A-Live」が言ったように、最良の代替手段はマクロです。.pch ファイルで次の MACRO を定義するだけです。

#ifdef DEBUG
   #define debug(format, ...) CFShow((__bridge void *)[NSString stringWithFormat:@"%s [LINE: %d] ==>> " format,__PRETTY_FUNCTION__, __LINE__, ## __VA_ARGS__]);
#else
#endif

さて、上記のマクロの使い方は?

サンプル

debug(@"Version Number is 1.0");

ノート:

スキーマを編集して、すべてのデバッグ ログを無効にすることができます。[スキーマの編集] の下で、最初のタブ、つまり「情報」を選択します。

「情報」タブで、ビルド構成を「リリース」に設定し、「OK」ボタンを押します。

ここに画像の説明を入力

于 2013-04-26T09:41:35.640 に答える