Objective-C Language
ロギング
サーチ…
構文
- 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
はメッセージを出力します。
NSLog
はNSString
を必要とし、最後に自動的に改行を追加します。 printf
はC文字列を必要とし、自動的に改行を追加しません。
NSLog
stderr
に出力を送り、 printf
出力をstdout
送ります。
printf
とNSLog
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!");
デバッグビルドでは、 DLog
はDLog
を呼び出し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];
}