【问题标题】: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
        
        }
        

        【讨论】:

          猜你喜欢
          • 2018-10-23
          • 1970-01-01
          • 1970-01-01
          • 2020-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多