Почему я могу извлечь одну строку из NSDictionary, но не другую? - PullRequest
0 голосов
/ 18 марта 2012

У меня есть NSDictionary, и я пытаюсь извлечь из него строку. По какой-то причине последняя строка кажется невосполнимой (!?!). В приведенном ниже коде я получаю объект NSString для labelString без каких-либо проблем. Но когда я пытаюсь получить NSString для foo, я всегда получаю ноль. Но я не вижу разницы - ты видишь, что я делаю неправильно?

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:CellStyleLabelledStringCell], @"cellStyle",
                      @"name", @"fieldName", 
                      @"Name", @"labelString", 
                      foodItem.name, @"contentString", 
                      @"foo", @"fookey",
                      nil];

NSString *string1 = (NSString *)[dict objectForKey:@"fookey"];
NSString *string2 = (NSString *)[dict objectForKey:@"labelString"];
NSLog(@"[%@][%@]", string1, string2);

Сообщение журнала выглядит следующим образом и создает резервную копию того, что я вижу в отладчике (т. Е. Строка1 равна нулю):

2012-03-17 21: 35: 03.302 QuickList7 [8244: fb03] [(null)] [Name]

Действительно озадачен. Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 18 марта 2012

foodItem.name - ноль, поэтому -[NSDictionary dictionaryWithObjectsAndKeys:] останавливается и не добавляет последующие объекты в словарь.

Другими словами, это как если бы вы сделали это:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:CellStyleLabelledStringCell], @"cellStyle",
                      @"name", @"fieldName", 
                      @"Name", @"labelString", 
                      nil];

Вот почему вы должны быть осторожны с любым методом, который принимает nil в качестве «конца аргументов».

1 голос
/ 18 марта 2012

Ответ Курта верен, foodItem.name имеет значение nil.

Чтобы предотвратить это, вы всегда можете проверить объекты на наличие нулей, прежде чем добавлять в словарь, или использовать следующий макрос для заменывсе ноль элементов с объектами NSNull:

#define n2N(value) (value ? value : [NSNull null])

Итак, используя этот макрос, ваш код выше будет выглядеть так:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSNumber numberWithInt:CellStyleLabelledStringCell], @"cellStyle",
                  @"name", @"fieldName", 
                  @"Name", @"labelString", 
                  n2N(foodItem.name), @"contentString", 
                  @"foo", @"fookey",
                  nil];

Кроме того, нетнеобходимо типизировать результат от objectForKey: до NSString, так как этот метод возвращает идентификатор.

...