2010-04-18 1 views
7

У меня проблема с NSDictionary, возвращающая null для NSString, хотя строка находится в словаре. Вот код:Что может вызвать objectForKey: вернуть значение null с допустимой строкой?

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

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

+0

Из любопытства после установки и регистрации 'aDict', что произойдет, если вы выполните DLog (@"% @ ", [aDict allKeys]);'? – Isaac

+0

Это * актуальный * код? Любой шанс, что вы неправильно набрали ключ? Что означает 'DLog (@"% @ ", [aDict allKeys])' give? –

+0

Возможно, вы также захотите попробовать logging 'newSourceString' с'% p' вместо '% @'. –

ответ

3

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

Try:

  1. Вход с NSLog.
  2. Проверьте значение newSourceString непосредственно в отладчике, пока код находится в режиме реального времени.
2

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

Одно из двух:

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

Как вы можете видеть, строка в словаре под ключ Newsource ...

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

Это просто странно.

+0

Каждый раз, когда я вставлял фигурные скобки, они прикручивали блок кода, поэтому мне пришлось их удалять (все еще не знаю, почему это происходит). – theMikeSwan

+0

Я обновил вопрос, включив фигурные скобки в оператор журнала, основанный на комментарии @ theMikeSwan выше. –

0

Я подозреваю, что ваша строка на самом деле буквально «(нуль)», то есть она длиной 6 букв и вызывается (-n-u-l-l-).

+0

Первая строка распечатки показывает, что ключ имеет значение «Второй вид». – TechZen

+0

Если это так, то шаг, который применяет 'stringByAppendingString:', не должен вызывать '(null)'. – Isaac

+0

Никто не думал, что это действительно смешно? Я собираюсь сыграть это как шалость на моем партнере в один прекрасный день =) –

1

Вы не пренебрегаете средой, в которой вы кодируете. Если это с 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, и некоторые из записей в другом словаре (загружаемом из файла) содержат символы Юникода. Это до сих пор единственная корреляция, которую я нашел - удаление юникода из исходного файла и повторное запуск приложения заставляет его работать.

Это не является проблемой для gnustep1.18 или> = gnustep1.20

2

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

for (id key in [aDict allKeys]){ 
     NSLog(@"%@:%@",key, [[key class] description]); 
    } 
} 
+0

Этот процесс помог мне решить мою проблему .. –

0

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