Что вызвало бы objectForKey: возвратить пустой указатель с допустимой строкой на месте?

У меня есть проблема с 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. Я даже попробовал опцию нейтрализации очистки проекта.

Кто-либо когда-либо сталкивался с этим, или я только что забыл что-то действительно основное?

7
задан Steve Harrison 18 April 2010 в 06:05
поделиться

4 ответа

На этом этапе по какой-то причине у вас осталось сообщение об ошибке от DLog.

Попробуйте:

  1. Ведение журнала с помощью NSLog.
  2. Проверьте значение newSourceString непосредственно в отладчике, пока код находится в рабочем состоянии.
3
ответ дан 7 December 2019 в 05:19
поделиться

Я подозреваю, что ваша строка на самом деле буквально "(ноль)", то есть она состоит из 6 букв и содержит ( -нулевой-).

0
ответ дан 7 December 2019 в 05:19
поделиться

Что заставит objectForKey: вернуть null с действительной строкой на месте?

Одно из двух:

  1. Словарь не содержит объекта для этого ключа. (Считаете ли вы , что это так, не имеет значения.)
  2. У вас нет словаря; aDict равно nil , поэтому вы отправляете сообщение objectForKey: на nil . Сообщения на nil ничего не делают, кроме возврата nil .

Как видите, строка находится в словаре под ключом newSource…

На самом деле, я не уверен, что там происходит. Описание NSDictionary (если оно содержит строку для этого ключа) будет {newSource = "здесь какая-то строка"; } , что не соответствует зарегистрированному вами описанию. С другой стороны, если это был объект, не являющийся словарем, вы должны получить исключение «не отвечает на селектор» при попытке отправить ему сообщение objectForKey: . Итак, хотя из вашего журнала кажется, что это что-то , я понятия не имею, что это такое, за исключением того, что это, вероятно, не словарь.

Тогда это просто странно.

2
ответ дан 7 December 2019 в 05:19
поделиться

Вы не можете пренебречь средой, в которой вы кодируете. Если это с 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

1
ответ дан 7 December 2019 в 05:19
поделиться