web-dev-qa-db-ja.com

Objective-Cオブジェクト(NSArrayまたはNSDictionary)に保存されているデータをダンプする方法

ここでばかげた質問を許してくれますが、他のプログラミング言語(PHPまたはPerl)などのスクリプト言語)では、変数に含まれるすべてのものを簡単にダンプできます。

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

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

45
jpm

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

NSLog(@"%@", myObj);

または

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

または

NSString *stringRep = [myObj description];

(最初の場合はコンソールに記録されます)、[myObj description]の結果を取得します。これは、descriptionnotを印刷する目的でNSObjectで定義されたメソッドです。 =オブジェクトのダンプ)。

Gdbでpo myObjを呼び出すと、[myObj debugDescription]を取得します(多くの場合、descriptionと同じですが、常にではありません)。

NSArrayNSDictionaryNSDataなどのクラスは、descriptionをオーバーライドして、その内容の非常に有用な再帰的説明を出力しますが、デフォルトの[NSObject description]は、インスタンスに対応するポインター値のみを出力します。

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

71
Barry Wark

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

po dictionary

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

ASCIIデータを含むNSDataを印刷するときにも便利です:

p (char *) [data bytes]
16
Ben Gottlieb

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のショートカットです。

10
Jason Coco

NSLogのロギングには注意してください->おそらく本番コードでは必要ありません。

製品がデバッグモードで実行されているときにNSLogを呼び出す代替ログ機能を使用することもできます。

4
diciu

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

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

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

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

3
TCB13