У меня есть проблема с NSDictionary
возврат null
для NSString
даже при том, что строка находится в словаре. Вот код:
- (void)sourceDidChange:(NSNotification *)aNote {
NSDictionary *aDict = [aNote userInfo];
DLog(@"%@", aDict);
NSString *newSourceString = [aDict objectForKey:@"newSource"];
DLog(@"%@", newSourceString);
newSourceString = [newSourceString stringByReplacingOccurrencesOfString:@" " withString:@""];
DLog(@"%@", newSourceString);
NSString *inspectorString = [newSourceString stringByAppendingString:@"InspectorController"];
DLog(@"%@", inspectorString);
newSourceString = [newSourceString stringByAppendingString:@"ViewController"];
DLog(@"%@", newSourceString);
}
И я получаю следующие операторы журнала:
2010-04-17 23:50:13.913 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] { newSource = "Second View"; }
2010-04-17 23:50:13.914 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
2010-04-17 23:50:13.916 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
Как Вы видите, строка находится в словаре под ключом newSource
, все же, когда я звоню objectForKey:
, Я добираюсь null
. Я даже попробовал опцию нейтрализации очистки проекта.
Кто-либо когда-либо сталкивался с этим, или я только что забыл что-то действительно основное?
На этом этапе по какой-то причине у вас осталось сообщение об ошибке от DLog.
Попробуйте:
newSourceString
непосредственно в отладчике, пока код находится в рабочем состоянии. Я подозреваю, что ваша строка на самом деле буквально "(ноль)", то есть она состоит из 6 букв и содержит ( -нулевой-).
Что заставит
objectForKey:
вернуть null с действительной строкой на месте?
Одно из двух:
aDict
равно nil
, поэтому вы отправляете сообщение objectForKey:
на nil
. Сообщения на nil
ничего не делают, кроме возврата nil
. Как видите, строка находится в словаре под ключом newSource…
На самом деле, я не уверен, что там происходит. Описание NSDictionary (если оно содержит строку для этого ключа) будет {newSource = "здесь какая-то строка"; }
, что не соответствует зарегистрированному вами описанию. С другой стороны, если это был объект, не являющийся словарем, вы должны получить исключение «не отвечает на селектор» при попытке отправить ему сообщение objectForKey:
. Итак, хотя из вашего журнала кажется, что это что-то , я понятия не имею, что это такое, за исключением того, что это, вероятно, не словарь.
Тогда это просто странно.
Вы не можете пренебречь средой, в которой вы кодируете. Если это с GNUstep, а именно с gnustep1.19, читайте дальше. В противном случае игнорируйте.
Я только что столкнулся с очень странной ошибкой в gnustep1.19 (.3), но она отлично имитирует этот вопрос.
NSString * key = <some string>
NSDictionary * dict = <some dictionary>
(gdb) p [dict objectForKey:key]
$20 = (struct objc_object *) 0x0
(gdb) p [dict objectForKey:@"MyKeyValue"]
$22 = (struct objc_object *) 0x7fffd94fe690
(gdb) p [key compare"@MyKeyValue"]
$25 = NSOrderedSame
В этом случае «ключ» инициализировался путем извлечения его из другого словаря NSDictionary, а некоторые записи в другом словаре (загруженном из файла) содержали символы Unicode. Это пока единственная корреляция, которую я обнаружил - удаление юникода из исходного файла и повторный запуск приложения заставляет его работать.
Это не проблема для gnustep1.18 или> = gnustep1.20