Почему вызов -allValues ​​в NSDictionary генерирует исключение? - PullRequest
2 голосов
/ 27 ноября 2011

Я пытаюсь получить все значения из nsdictionary, но он выдает исключение во второй строке

NSDictionary* thetimeLineDict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError];
NSArray* theallTweets = [thetimeLineDict allValues];

ниже - исключение из консоли

2011-11-27 14:56:38.156 SparkTweet[2066:1390b] -[__NSCFArray allValues]: unrecognized selector sent to instance 0x8128310
2011-11-27 14:56:38.158 SparkTweet[2066:1390b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray allValues]: unrecognized selector sent to instance 0x8128310'
*** First throw call stack:
(0x14c0052 0x189cd0a 0x14c1ced 0x1426f00 0x1426ce2 0x2c48 0x33306 0x1b38445 0x1b39ecf 0x1b39d28 0x1b394af 0x9b632b24 0x9b6346fe)
terminate called throwing an exception

Почему это может происходить?

Ответы [ 2 ]

7 голосов
/ 27 ноября 2011

Поскольку allValues не является допустимым методом для NSArray, который был возвращен.

Анализатор JSON не всегда возвращает словарь как внешний объект Objective-C. Скорее, то, что вы получите обратно, зависит от того, какой текст JSON был введен, а для входящего текста JSON был массив ([]) в качестве внешней структуры.

(Обратите внимание, что по общему правилу вы всегда должны проверять результат из анализатора JSON, чтобы увидеть, какой тип был возвращен, если только вы не уверены для абсолютной уверенности, что это всегда будет массив или, наоборот, "объект" / словарь.)

4 голосов
/ 27 ноября 2011

JSON, который вы читаете, содержит Array, а не NSDictionary, вы можете проверить это, вызвав следующее после выполнения анализа данных:

NSLog(@"The class is %@",[thetimeLineDict class]);

Вывод, вероятно, будет:

2011-11-27 14:56:38.156 SparkTweet[2066:1390b]:The class is NSArray

Проблема может заключаться в том, что у вас есть массив словарей, а не просто словарь.

...