NSNullが私のinitWithDictionaryをクラッシュさせる
-
05-07-2019 - |
質問
JSONファイルを解析しています。
NSDictionaryを取得した後、ディクショナリ内のオブジェクトをオブジェクトの配列に解析します。ただし、特定のJSONファイルではNULLになりますが、これは問題ありませんが、何かを期待しているがnullになっている場所ではアプリがクラッシュします。
- (id)initWithDictionary:(NSDictionary *)boxDictionary {
if ([self init]) {
// ...
int numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
int numberOfItemsInBoxes = [[boxDictionary valueForKey:@"box_items_count"] intValue];
// ..
}
return self;
}
解決
基本的な問題は、valueForKey :.の呼び出しから返されるNSNullにintValueメソッドがないことのようです。
intValueメソッドを追加できますが、NSNullに対して何を返しますか? 0? -1?
そのためのコードは次のようになります。
MyNullExtensions.h内:
@interface NSNull (integer)
-(int) intValue;
@end
そしてMyNullExtensions.mで:
#import "MyNullExtensions.h"
@implementation NSNull (functional)
-(int) intValue
{
return -1;
}
@end
後で、 ブレイク。
他のヒント
int
を nil
にすることはできないため、 intValue
にはを取得できないことを通知する方法がありません
。 nil
オブジェクトのintValue intValue
を要求する前に、 valueForKey:
からオブジェクトが返されたかどうかを確認する必要があります。
if ([boxDictionary valueForKey:@"box_count"])
numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
intValueを呼び出す前に、NSNullに対して簡単なテストを行うだけです。 NSNullオブジェクトを拡張する必要はありません。
if ([rate valueForKey:@"value"]!=[NSNull alloc]) {
// put your code here
}
所属していません StackOverflow