2011-12-22 1 views
7

Iは、次の出力テストObjective-Cではヌルため

images in definitionDict (
    "/some/brol/brol.jpg" 
) 
NOTNULL 
images in definitionDict <null> 
NOTNULL 

Iは画像アレイである第二のケースを理解していないを与えるループ

NSArray * images = [definitionDict objectForKey:@"Images"]; 
    NSLog(@"images in definitionDict %@", images); 
    if (!images) 
     NSLog(@"NULL"); 
    else 
     NSLog(@"NOTNULL"); 

次のコードを有しますヌル。私のテストでこれが正しく検出されないのはなぜですか?どのように私はそのような問題をデバッグできますか?

答えて

19

<null>は、nilではありません。 nilは、印刷時に(null)を印刷します。あなたが持っているのはNSNullです。 NSNullはオブジェクトであり、あまり反応しません。使用するプレースホルダとして利用できます。 NSNullをテストするために

あなたは、あなたがObjective-Cのオブジェクトのメモリアドレス、またはその他のポインタを印刷したい場合はNSNull

+0

ありがとう、それは私のためにそれを解決しました。 – madewulf

1

詳細はdocsを参照してくださいif ([images isEqual:[NSNull null]])

を使用することができますフラグ%pではなく、%@を使用してください。フラグ%@は、文字列が必要です。

ただし、引数が文字列でない場合、NSLogは自動的に渡されたオブジェクトの-descriptionを呼び出します。0x00000000

NSObject *o = [[NSObject alloc] init]; 
NSLog(@"%p", o); 
[o release]; 

出力:何か

0x12345678のようなマインドメソッドは NSNullオブジェクトを返すときには、そのオブジェクトの -descriptionは、文字列 <null>

NSObject *o = nil; 
NSLog(@"%p", o); 

出力を返します。

NSNull *n = [NSNull null]; 
NSLog(@"%p", n); 

出力:常に同じになりますが、オブジェクトが配列に自分のしているかどうかをテストするための正しい方法は、このようなものです0x00000000

異なりますメモリアドレス。

NSArray *myArray = [someObject array]; 
if([myArray isEqual:[NSNull null]]) { 
    NSLog(@"No objects"); 
} else { 
    NSLog(@"%d objects.", (int)[myArray length]; 
} 
+1

この状況では、下部のソリューションがクラッシュします。これはオブジェクトを含まない配列ではありません。これはNSNullであり、NSNullは長さに応答しません。 –

+0

@JoshuaWeinberg私はそれを編集しました。 Appleがなぜ 'NSNull'クラスを作ったのかはまだ分かりません。特にNSDictionaryでNSNullオブジェクトを設定するのはなぜでしょうか?キーを定義しないだけなら、メソッドは 'nil'を返します。 – v1Axvw

+0

この場合、オブジェクトがないこと、ヌルオブジェクトを持つ節を区別できる必要があります。 'nil'はちょうどゼロですが、キーが存在しない場合にも戻ります。そこでここでは、JSONの一部を解析してJSON 'null'を含む辞書に入れた後、NSNullが作成されたと思います。 –

関連する問題