【问题标题】:NSNull crashes my initWithDictionaryNSNull 使我的 initWithDictionary 崩溃
【发布时间】:2009-11-27 19:35:04
【问题描述】:
我正在解析一个 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;
}
【问题讨论】:
标签:
objective-c
json
null
nsdictionary
【解决方案1】:
基本问题似乎是 NSNull 上没有 intValue 方法,您从 valueForKey 的调用中返回:。
您可以添加 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
后来,
布莱克。
【解决方案2】:
int 不能是nil,因此intValue 无法告诉您它无法获取nil 对象的intValue。在请求 intValue 之前,您需要检查是否有从 valueForKey: 返回的对象。
if ([boxDictionary valueForKey:@"box_count"])
numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
【解决方案3】:
在调用 intValue 之前,只需对 NSNull 做一个简单的测试。无需扩展 NSNull 对象。
if ([rate valueForKey:@"value"]!=[NSNull alloc]) {
// put your code here
}