サーチ…


構文

  • NSLog(@ "テキストをログに記録"); //基本的なテキストログ
  • NSLog(@ "データ:%f - %.2f"、myFloat、anotherFloat); //浮動小数点数を含むロギングテキスト。
  • NSLog(@ "データ:%i"、myInteger); //整数を含むテキストをロギングする。
  • NSLog(@ "データ:%@"、myStringOrObject); //別のStringまたはNSObjectから派生したオブジェクトを参照するテキストを記録する。

備考

さまざまな種類のオブジェクトとデータ型のロギングについては、 Objective-C、Format Specifiersを参照してください。

ロギング

NSLog(@"Log Message!");
NSLog(@"NSString value: %@", stringValue);
NSLog(@"Integer value: %d", intValue);

NSLogの最初の引数は、ログメッセージ形式を含むNSStringです。残りのパラメータは、フォーマット指定子の代わりに値として使用されます。

書式設定は、任意のObjective-Cオブジェクトの追加の書式指定子%@を除いてprintfとまったく同じです。この:

NSLog(@"%@", object);

次のものと同等です。

NSLog(@"%s", [object description].UTF8String);

NSLogとprintf

NSLog(@"NSLog message");
printf("printf message\n");

出力:

2016-07-16 08:58:04.681 test[46259:1244773] NSLog message
printf message

NSLogはログメッセージに加えて日付、時刻、プロセス名、プロセスID、スレッドIDを出力します。 printfはメッセージを出力します。

NSLogNSStringを必要とし、最後に自動的に改行を追加します。 printfはC文字列を必要とし、自動的に改行を追加しません。

NSLog stderrに出力を送り、 printf出力をstdout送ります。


printfNSLog format-specifiers中にはいくつかの違いがあります。たとえば、ネストされた文字列を含めると、次の違いが発生します。

NSLog(@"My string: %@", (NSString *)myString);
printf("My string: %s", [(NSString *)myString UTF8String]);

NSLog出力形式

NSLog(@"NSLog message");

NSLogを呼び出すことによって印刷されるメッセージは、Console.appで表示されるときに次の形式になります。

日付時間プログラム名プロセスID スレッドID メッセージ
2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog message

変数値のロギング

次のようなリテラルフォーマット文字列なしでNSLogを呼び出すべきではありません:

NSLog(variable);    // Dangerous code!

変数がない場合にはNSStringため、プログラムは、クラッシュしてしまいますNSLog期待しNSString

変数がNSStringの場合は、文字列に%が含まれていなければ動作します。 NSLog%シーケンスをフォーマット指定子として解析し、スタックからガーベッジ値を読み取ってクラッシュを引き起こしたり、 任意のコードを実行したりします

代わりに、常に最初の引数を次のように書式指定子にします。

NSLog(@"%@", anObjectVariable);
NSLog(@"%d", anIntegerVariable);

空のメッセージが印刷されない

空の文字列を表示するようにNSLogと、ログは完全に省略されます。

NSString *name = @"";
NSLog(@"%@", name);  // Resolves to @""

上記のコードは何も印刷しません

ログの前にラベルを付けることをお勧めします。

NSString *name = @"";
NSLog(@"Name: %@", name);  // Resolves to @"Name: "

上記のコードは次のように表示されます:

2016-07-21 14:20:28.623 App[87711:6153103] Name: 

リリースビルドからのログステートメントの削除

NSLogから印刷されたメッセージは、アプリケーションのリリースビルドでもConsole.appに表示されますが、これはデバッグにのみ役立つ出力には意味がありません。これを修正するには、このマクロをNSLog代わりにデバッグログに使用します。

#ifdef DEBUG
#define DLog(...) NSLog(__VA_ARGS__)
#else
#define DLog(...)
#endif

使用するには:

NSString *value = @"value 1";
DLog(@"value = %@", value);
// little known fact: programmers look for job postings in Console.app
NSLog(@"We're hiring!"); 

デバッグビルドでは、 DLogDLogを呼び出しNSLog 。リリースビルドでは、 DLogは何もしません。

__FUNCTIONを使用する__

NSLog(@"%s %@",__FUNCTION__, @"etc etc");

クラスとメソッドの名前を出力に挿入します。

2016-07-22 12:51:30.099 loggingExample[18132:2971471] -[ViewController viewDidLoad] etc etc

NSLogとBOOLタイプ

NSLogを使用してブール型を出力する書式指定子はありません。ブール値を出力する1つの方法は、文字列に変換することです。

BOOL boolValue = YES;
NSLog(@"Bool value %@", boolValue ? @"YES" : @"NO");

出力:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value YES

ブール値を出力する別の方法は、整数にキャストしてバイナリ出力(1 = yes、0 = no)を実現することです。

BOOL boolValue = YES;
NSLog(@"Bool value %i", boolValue);

出力:

2016-07-30 22:53:18.269 Test[4445:64129] Bool value 1

NSLogメタデータのロギング

NSLog(@"%s %d %s, yourVariable: %@", __FILE__, __LINE__, __PRETTY_FUNCTION__, yourVariable);

ログに記録する変数とともに、ファイル、行番号、関数データを記録します。これにより、特に冗長なファイル名やメソッド名を使用してログ行を長くすることができますが、エラー診断のスピードアップに役立ちます。

これをマクロでラップすることもできます(これをシングルトンに格納するか、または最も必要とする場所)。

#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

次に、ログに記録するときは、単に

ALog(@"name: %@", firstName);

あなたのようなものを与えるでしょう。

 -[AppDelegate application:didFinishLaunchingWithOptions:] [Line 27] name: John

ファイルへの追加によるロギング

NSLogは良いですが、代わりに次のようなコードを使ってファイルに追加してログすることもできます:

NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
    [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
    fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( fh ) {
    @try {
        [fh seekToEndOfFile];
        [fh writeData:[self dataUsingEncoding:enc]];
    }
    @catch (...) {
    }
    [fh closeFile];
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow