2014-01-21 2 views
3

В GitHub У меня a simple iPhone app, который извлекает информацию о пользователе (с помощью OAuth) из социальной сети Mail.ru:[__NSArrayM objectForKeyedSubscript]: непризнанные селектор направлен например - исходный код и скриншот прилагается

app screenshot

Он извлекает и распечатывает информацию, но затем падает.

Как программирования новичка IOS Я запутался ниже выхода (также см the full output at PasteBin):

2014-01-21 21:21:10.873 oauthMailru[8228:3307] -[__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance 0x8a97290 
2014-01-21 21:21:10.875 oauthMailru[8228:3307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance 0x8a97290' 
*** First throw call stack: 
(
    0 CoreFoundation      0x01aa65e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x018298b6 objc_exception_throw + 44 
    2 CoreFoundation      0x01b43903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 
    3 CoreFoundation      0x01a9690b ___forwarding___ + 1019 
    4 CoreFoundation      0x01a964ee _CF_forwarding_prep_0 + 14 
    5 oauthMailru       0x00003a62 __47-[ViewController fetchMailruWithToken:ForUser:]_block_invoke + 402 
    6 Foundation       0x01545695 __67+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_2 + 151 
    7 Foundation       0x014a5945 -[NSBlockOperation main] + 88 
    8 Foundation       0x014fe829 -[__NSOperationInternal _start:] + 671 
    9 Foundation       0x0147b558 -[NSOperation start] + 83 
    10 Foundation       0x01500af4 __NSOQSchedule_f + 62 
    11 libdispatch.dylib     0x021344b0 _dispatch_client_callout + 14 
    12 libdispatch.dylib     0x02121018 _dispatch_async_redirect_invoke + 202 
    13 libdispatch.dylib     0x021344b0 _dispatch_client_callout + 14 
    14 libdispatch.dylib     0x02122eeb _dispatch_root_queue_drain + 287 
    15 libdispatch.dylib     0x02123137 _dispatch_worker_thread2 + 39 
    16 libsystem_pthread.dylib    0x024c0dab _pthread_wqthread + 336 
    17 libsystem_pthread.dylib    0x024c4cce start_wqthread + 30 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

ли кто-нибудь, пожалуйста, знать, что происходит и как читать такие сбои?

Мои исходные файлы: ViewController.m, который отображает UIWebView, а затем перетекает в DetailViewController.m

+3

Обратите внимание, что сообщение об ошибке довольно четко, если вы читали внимательно. В нем говорится, что у вас есть массив ('__NSArrayM' - это внутреннее имя класса для NSArray), и вы пытаетесь выполнить операцию« keyed »(vs« indexed »). «Traceback» сообщает вам, что ошибка произошла в вашем методе 'fetchMailruWithToken:' 'ViewController' (первый несистемный метод в списке), поэтому посмотрите там для операции' objectForKey' или некоторых таких. Повторите операцию с точкой останова в этой операции и дамп объекта в этой точке. То, что вы считаете NSDictionary, окажется NSArray. –

ответ

20

Ваш код думает JSON десериализует на объект (словарь), но на самом деле это десериализует на массив, содержащий один объект. Попробуйте это:

NSMutableArray *topLevelArray = [NSJSONSerialization JSONObjectWithData:data 
    options:NSJSONReadingMutableContainers error:nil]; 
NSDictionary *dict = topLevelArray[0]; 

Если вы хотите, чтобы проверить, что вы получаете, вы можете использовать isKindOfClass: так:

id jso = [NSJSONSerialization JSONObjectWithData:data 
    options:NSJSONReadingMutableContainers error:nil]; 
if (jso == nil) { 
    // Error. You should probably have passed an NSError ** as the error 
    // argument so you could log it. 
} else if ([jso isKindOfClass:[NSArray class]]) { 
    NSArray *array = jso; 
    // process array elements 
} else if ([jso isKindOfClass:[NSDictionary class]]) { 
    NSDictionary *dict = jso; 
    // process dictionary elements 
} else { 
    // Shouldn't happen unless you use the NSJSONReadingAllowFragments flag. 
} 
+2

Он находится в вашем отладочном выходе. В нем говорится: 'dict = ('. Когда вы регистрируете массив, он окружен круглыми скобками. Когда вы регистрируете словарь, он окружен фигурными фигурными скобками. –

+0

Спасибо, я это понимаю. Последний вопрос: пожалуйста, в предложенном вами кодексе, который вы назначаете 'NSMutableArray', но что, если разобранный JSON не является массивом (по какой-то причине), как поймать такие« исключения »? –

+1

Я отредактировал свой ответ. –