48

ここでばかげた質問になる可能性があることをお許しください。ただし、他のプログラミング言語 (PHP や Perl などのスクリプト言語) では、多くの場合、変数に含まれるすべてのものを簡単にダンプできます。

たとえば、PHP にはvar_dump()orprint_r()関数があります。PerlにはData::DumperCPANクラスなどがあります。

Objective-Cにこのようなものはありますか? いくつかのケースでは、gdb を使用して各変数を検査する代わりに、そのようにすべてをダンプできると非常に便利です。

4

5 に答える 5

74

Cocoaには、PHPのprint_rやpythonのreprのような「ダンプ」はありません。これらの言語のように、オブジェクトを「表す」テキスト形式がないためです。使用する場合

NSLog(@"%@", myObj);

また

NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];

また

NSString *stringRep = [myObj description];

オブジェクトの説明(ダンプではなく)を出力する目的でで[myObj description]定義されたメソッドの結果(最初のケースではコンソールにログに記録されます)を取得します。NSObject

po myObjgdbで呼び出すと、次のようになります[myObj debugDescription](多くの場合、と同じですdescriptionが、常にではありません)。

NSArrayandNSDictionaryNSDataoverrideのようなクラスdescriptionは、その内容の非常に便利な再帰的説明を出力しますが、デフォルトで[NSObject description]は、インスタンスに対応するポインター値のみが出力されます。

問題の型のコードを制御する場合は、それらのメソッドdescriptionまたはdebugDescriptionメソッドをオーバーライドして、必要なものを返すことができます。そうでない場合は、カテゴリを使用してdescriptionorメソッドをオーバーライドするか、カテゴリを使用して、を使用してgdbから呼び出すことができるようなaまたはsomeを定義できます。debugDescriptionmyDebugDescriptionpo [myObj myDebugDescription]

于 2008-11-14T04:57:20.630 に答える
17

gdb print object コマンドを使用して、デバッガーでオブジェクトをすばやく表示することもできます。

po dictionary

これは基本的に、コード内から NSLog(...) を呼び出すのと同じです。

ASCII データを含む NSData を出力する場合にも役立ちます:

p (char *) [data bytes]
于 2008-11-14T05:08:34.460 に答える
10

オブジェクトの内容をダンプするには、NSLog() を使用します。例えば:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);

NSLog には、printf と同様に、printf スタイルのフォーマット文字列 (NSString オブジェクトが必要) の後にパラメーターの可変リストが続きます。置換文字 %@ は、オブジェクトの説明メソッドを表します。これは、Cocoa でほとんどの Objective-C オブジェクトをダンプするのに役立ちます。

gdb を使用してオブジェクトの内容をダンプしたい場合 (gdb でタグ付けされているようです)、print の代わりに特別な "po" ディレクティブを使用してください。例えば:

gdb) po myData

gdb は myData オブジェクトをダンプします。po は print-object のショートカットです。

于 2008-11-14T04:29:19.470 に答える
4

NSLog のログ記録には注意してください -> プロダクション コードでは必要ないでしょう。

製品がデバッグ モードで実行されている場合は、NSLog を呼び出す別のログ機能を使用することをお勧めします。

于 2008-11-14T07:14:26.687 に答える
3

私は通常、これを使用して NSArray の内容を「デバッグ」します。

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}

コードは NSArray 内のすべてのオブジェクトを列挙し、すべてのオブジェクトをmyarray反復して出力します。

これが誰かに役立つことを願っています!

于 2012-03-13T23:09:44.013 に答える