NSNull 使我的 initWithDictionary 崩溃

Posted

技术标签:

【中文标题】NSNull 使我的 initWithDictionary 崩溃【英文标题】:NSNull crashes my 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;

【问题讨论】:

【参考方案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


【讨论】:

以上是关于NSNull 使我的 initWithDictionary 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

替换嵌套 NSDictionary 中出现的 NSNull

Swift不检索Firebase值(返回值为NSNull)

TouchJSON,处理 NSNull

使 NSNull 符合 NilLiteralConvertible

(转)NSNULL

iOS中使用nil NULL NSNULL的区别