6

新しいプログラマーとして、私は の魔法を発見しNSlog、コード全体でそれを使用しています。NSZombieEnabledこれは、デバッグに (とともに) 非常に役立ちました。

シミュレーターがこれらすべてのものを出力するので、確実なパフォーマンス ヒットが見られます。デバイスでそのようなヒットは見られないと思いますが、よくわかりません。

それで、すべてを残すのに何か費用がかかりNSLogsますか?デバイスでより多くのメモリを使用していますか? それとも、デバイス用にコンパイルするときのコメントのように、コンパイラはそれらを無視しますか?

編集:

からの提案に従って、これが私が実装したものですrano.

私のApp_Prefix.pchファイルに、次を追加しました。

// 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__);

そして、私のProject Infoインスペクターで、Debug構成のために、見出しの下に、という名前の一番上のエントリGCC 4.2 - Preprocessing,に値を追加しましたDEBUGPreprocessor Macros.

魅力のように機能します-バージョンDLogをビルドすると常に出力されます。DebugALog

4

3 に答える 3

7

NSLog確かに単純なものよりも高価printfですが、Objective-C および Cocoa フレームワークにもう少し統合されています。

ところで、真剣にプログラミングしていると、ほとんどのニーズには不十分であることに気付くでしょう。この記事とその参考文献を見て、賢い方法で置き換える方法を考えてください。

このようにして、不要になったときにコンパイラに無視させることもできます (たとえば、コードをリリースするときなど)。#ifdef一般に、コードの集中的なループ/シーケンスを計算する際にログ関数を呼び出すことができます。

于 2010-11-08T22:33:48.720 に答える
0

上記の回答は時代遅れです。CocoaLumberjackはNSLogよりもはるかに優れており、上記の回答よりもはるかに多くの機能を提供します。

于 2013-01-02T02:57:02.220 に答える
0

NSLogマクロとして実装されていないため、間違いなくコストがかかります。それを定量化し、それが重要かどうかを判断することはより困難です。それを行う唯一の確実な方法は、独自のアプリケーションを測定することです。

于 2010-11-08T22:35:12.460 に答える