-2

(XCode 4.3) EXC_BAD_ACCESS を含む NSLog ステートメントで次のクラッシュが発生するのはなぜですか?

BOOL autoFlag
@property BOOL autoFlag
@synthesize autoFlag

[object setAutoFlag:YES]

NSLog(@"%@", [object autoFlag]);  //crashes here in debugger with EXC_BAD_ACCESS

NSLog(@"%d"...を出力する でなんとか回避できました1が、なぜ機能しない@"%@"のですか? 値を文字列に変換するだけだと思いましたか?

4

2 に答える 2

6

%@ は、NSObject クラスの子孫であるオブジェクトの説明を出力するために使用されますが、これを上書きして、オブジェクトが必要なものを出力するようにすることができます。

autoFlag がオブジェクトでない限り、プログラムがクラッシュします。NSLogステートメントでこれらのタイプのエラーが発生することは非常に一般的です。これは、コンパイラーが出力したい「もの」の種類を伝えることができず、ほとんどの場合、事前に知ることができないためです(出力される場所にはいくつかの例外があります)。間違った識別子を使用していることを伝えます)。

見たいものが「True」または「YES」のようなものである場合、次のようなものが必要です

NSLog(@"Auto Flag: %@",object.autoFlag? @"True":@"False");
于 2012-06-19T00:46:45.590 に答える
2

以下をご覧ください: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

%dブール値を整数として出力するように指示しているため、このメソッドを使用して0(false) または(true) のいずれかが返されます。1ブール値に固有のフォーマッターはありません。

コードが を使用してメモリ アドレスへのポインターを期待しているため、クラッシュが発生しました。%@代わりに、プリミティブ データ型 (この場合はブール値) を指定しました。アプリケーションがこのアドレスを使用しようとして、そこにオブジェクトがなかった場合、EXEC_BAD_ACCESS.

于 2012-06-19T00:45:22.940 に答える