- [NSNull objectForKeyedSubscript:]: непризнанный селектор, отправленный в экземпляр

У меня есть исключение, в котором говорится:

-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance

Говорят, я пытаюсь получить доступ к объекту NSNull с помощью ключа? Любая идея, что вызывает это и как его исправить или отладить дальше?

Ответ 1

Способом исправить это не попытка objectProKeyedSubscript в объекте NSNull. (Я уверен, что вы обрабатываете некоторые данные JSON и не готовы к значению NULL.)

(И, по-видимому, objectForKeyedSubscript - это то, что означает новый массив [x].)

(Обратите внимание, что вы можете протестировать NSNull, просто сравнивая с == с [NSNull null], так как в приложении есть один и только один объект NSNull.)

Ответ 2

Что бы ни стоило хранить, несмотря на то, что говорит редактор, во время выполнения вы сохраняете NSNull, а затем пытаетесь вызвать objectForKeyedSubscript. Я предполагаю, что это происходит на том, что ожидается NSDictionary. Что-то вроде:

NSString *str = dict[@"SomeKey"]

Либо часть кода заранее не выполняет свою работу и не исследует ее, либо не выполняет некоторую проверку:

NSDictionary *dict = ...;

if ( [dict isKindOfClass:[NSDictionary class]] ) {
    // handle the dictionary
}
else {
   // some kind of error, handle appropriately
}

У меня часто бывает такой сценарий при работе с сообщениями об ошибках из сетевых операций.

Ответ 3

Я предлагаю добавить категорию в NSNull для обработки этого так же, как вы ожидали бы обработки вызова подстроки, если бы он был отправлен на нуль.

@implementation NSNull (Additions)

- (NSObject*)objectForKeyedSubscript:(id<NSCopying>)key {
    return nil;
}

- (NSObject*)objectAtIndexedSubscript:(NSUInteger)idx {
    return nil;
}

@end

Простой способ тестирования выглядит следующим образом:

id n = [NSNull null];
n[@""];
n[0];

С этой категорией этот тест следует обрабатывать успешно/мягко.