NSNull вылетает мой initWithDictionary - PullRequest
0 голосов
/ 27 ноября 2009

Я анализирую файл JSON.

После получения NSDictionary я анализирую объекты в словаре в массив объектов. Тем не менее, для некоторых файлов JSON я получаю 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;
}

Ответы [ 3 ]

4 голосов
/ 27 ноября 2009

Основная проблема, по-видимому, заключается в том, что в 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

Позже, Блейк.

0 голосов
/ 30 ноября 2012

Просто сделайте простой тест с NSNull, прежде чем вызывать intValue. Нет необходимости расширять объект NSNull.

if ([rate valueForKey:@"value"]!=[NSNull alloc]) {

    // put your code here

}
0 голосов
/ 27 ноября 2009

int не может быть nil, поэтому intValue не может сказать вам, что не может получить intValue объекта nil. Вам нужно проверить, получил ли вы объект, возвращенный с valueForKey:, прежде чем запрашивать его intValue.

if ([boxDictionary valueForKey:@"box_count"])
    numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
...