0

実数または「null」を値として返すJSONエンコードされたデータ文字列を返すAPIがあります。JSONに数値または文字列値が含まれている限り、すべてが期待どおりに機能します。key:valueペアの値がnullの場合、以下のコードがクラッシュします。

SBJSONからNULLを取得しているときにNSDictionaryobjectForKeyを適切にテストするにはどうすればよいですか?

APIがfiletypeに対してnullを返すと、以下のコードはif()行でクラッシュします。

私のObjective-Cコードは、期待値をテストしようとします。

if (1 == [[task valueForKey:@"filetype"] integerValue]) {
    // do something
} else {
    // do something else
}

API JSON出力:

{"tclid":"3","filename":null,"filetype":null}

NSDictionaryのNSLog()出力は次のとおりです。

task {
    filename = "<null>";
    filetype = "<null>";
    tclid = 3;
}
4

2 に答える 2

5

JSONからCocoaコレクションにデータを転送する場合、CocoaコレクションにNSNull空のスロットを含めることはできないため、このクラスは「値なし」を表すために使用されます。それ自体を印刷<null>する方法です。NSNull

これをテストするには、を使用できますsomeObject == [NSNull null]。これはシングルトンであり、プロセスごとにインスタンスが1つしかないNSNullため、ポインター比較は機能しますが、通常のCocoa比較規則に従って、を使用することをお勧めします[someObject isKindOfClass:[NSNull class]]

integerValueそのNSNullオブジェクトに送信しているため、クラッシュが発生します。NSNull応答せずintegerValue、例外を発生させます。

于 2012-07-09T21:41:58.673 に答える
0

最初に、値がnullであるかどうかをテストする必要があります。値がnullの場合、intValueメソッドを実行するとアプリケーションがクラッシュする可能性があります。これを行うことでうまくいくはずです。

if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
    // do something
} else {
     // do something else
}

お役に立てば幸いです。

于 2012-07-09T21:43:46.180 に答える