Что заставит objectForKey: возвращать ноль с правильной строкой на месте? - PullRequest
7 голосов
/ 18 апреля 2010

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

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

Ответы [ 6 ]

3 голосов
/ 18 апреля 2010

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

Попытка:

  1. Регистрация с NSLog.
  2. Проверьте значение newSourceString непосредственно в отладчике, пока код активен.
2 голосов
/ 24 января 2013

Я столкнулся с подобной проблемой. Для меня проблема заключалась в том, что я думал, что мой ключ - это строка NSString, тогда как на самом деле это был NSNumber. Вы можете проверить свой ключ с помощью следующего

for (id key in [aDict allKeys]){
        NSLog(@"%@:%@",key, [[key class] description]);
    }
}
2 голосов
/ 18 апреля 2010

Что может заставить objectForKey: возвращать ноль с правильной строкой на месте?

Одна из двух вещей:

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

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

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

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

1 голос
/ 07 июня 2010

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

0 голосов
/ 24 января 2013

Я подозреваю, что aDict не является экземпляром NSDictionary. зарегистрируйте свой класс для подтверждения.

0 голосов
/ 18 апреля 2010

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

...