- [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];
С этой категорией этот тест следует обрабатывать успешно/мягко.