ここでばかげた質問を許してくれますが、他のプログラミング言語(PHPまたはPerl)などのスクリプト言語)では、変数に含まれるすべてのものを簡単にダンプできます。
たとえば、PHPにはvar_dump()
またはprint_r()
関数があります。PerlにはData::Dumper
CPANクラスなど.
Objective-Cにはこのようなものがありますか?いくつかのケースでは、gdbを使用して各変数を検査する代わりに、そのようなすべてをダンプできると非常に便利です。
Cocoaには、PHPのprint_rやpythonのreprのような「ダンプ」はありません。これらの言語のようにオブジェクトを「表す」テキスト形式がないためです。使用する場合
NSLog(@"%@", myObj);
または
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];
または
NSString *stringRep = [myObj description];
(最初の場合はコンソールに記録されます)、[myObj description]
の結果を取得します。これは、description(notを印刷する目的でNSObject
で定義されたメソッドです。 =オブジェクトのダンプ)。
Gdbでpo myObj
を呼び出すと、[myObj debugDescription]
を取得します(多くの場合、description
と同じですが、常にではありません)。
NSArray
、NSDictionary
、NSData
などのクラスは、description
をオーバーライドして、その内容の非常に有用な再帰的説明を出力しますが、デフォルトの[NSObject description]
は、インスタンスに対応するポインター値のみを出力します。
問題の型のコードを制御する場合、description
またはdebugDescription
メソッドをオーバーライドして、必要なものを返すことができます。そうでない場合は、カテゴリを使用してdescription
またはdebugDescription
メソッドをオーバーライドするか、カテゴリを使用してmyDebugDescription
またはpo [myObj myDebugDescription]
を使用してgdbから呼び出すことができるものを定義できます。
gdb print objectコマンドを使用して、デバッガーでオブジェクトをすばやく表示することもできます。
po dictionary
これは基本的に、コード内からNSLog(...)を呼び出すのと同じです。
ASCIIデータを含むNSDataを印刷するときにも便利です:
p (char *) [data bytes]
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のショートカットです。
NSLogのロギングには注意してください->おそらく本番コードでは必要ありません。
製品がデバッグモードで実行されているときにNSLogを呼び出す代替ログ機能を使用することもできます。
NSArrayの内容を「デバッグ」するには、通常これを使用します。
NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;
while ( cobj = [arrenum nextObject] ) {
NSLog(@"%@", cobj);
}
このコードは、NSArray myarray
内のすべてのオブジェクトを列挙し、すべてのオブジェクトを反復して印刷します。
これが誰かに役立つことを願っています!