2014-11-12 3 views
1

Для ниже фрагмента кода: ошибка возникает при setObject: forKey:NSMutableDictionary SetObject: forkey: сбой с сообщением непризнанного селектора

response <--is an NSDictionary 

if(response){ 
       NSMutableArray *lifeArray = [[NSMutableArray alloc] init]; 
       NSMutableDictionary *responseDict = [[NSMutableDictionary alloc] init]; 
       responseDict = (NSMutableDictionary *)[response mutableCopy]; 
       [responseDict setObject:@"life" forKey:@"label"]; <-- Error here 
} 

Обратите внимание, что переменная responseDict является NSMutableDictionary, так как скопированы с помощью mutableCopy.

сообщение

Ошибки:

 
2014-11-12 12:16:08.534 Lifetape[84381:508759] -[__NSCFArray setObject:forKey:]: unrecognized selector sent to instance 0x7a296700 
2014-11-12 12:16:08.536 Lifetape[84381:508759] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray setObject:forKey:]: unrecognized selector sent to instance 0x7a296700' 
*** First throw call stack: 
(
    0 CoreFoundation      0x028fbdf6 __exceptionPreprocess + 182 
    1 libobjc.A.dylib      0x02557a97 objc_exception_throw + 44 
    2 CoreFoundation      0x02903a75 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277 
    3 CoreFoundation      0x0284c9c7 ___forwarding___ + 1047 
    4 CoreFoundation      0x0284c58e _CF_forwarding_prep_0 + 14 
    5 Lifetape       0x000dfb83 __50-[LTTimeLineTableViewController getTimeIntervals:]_block_invoke + 307 
    6 Lifetape       0x0014cedb -[MethodInvoker maybeInvokeCallback] + 395 
    7 Lifetape       0x0014d19f -[MethodInvoker receiveResultWithError:andResult:] + 399 
    8 Lifetape       0x00143e38 -[MeteorClient(Connection) livedata_result:] + 1544 
    9 Lifetape       0x00138674 __54-[MeteorClient(Connection) initConnectionWithOptions:]_block_invoke_3 + 2660 
    10 Lifetape       0x0014b2b5 -[MeteorClient didReceiveMessage:] + 197 
    11 Lifetape       0x0014eb7d -[ObjectiveDDP webSocket:didReceiveMessage:] + 269 
    12 Lifetape       0x0015d986 __30-[SRWebSocket _handleMessage:]_block_invoke + 102 
    13 libdispatch.dylib     0x031e941a _dispatch_call_block_and_release + 15 
    14 libdispatch.dylib     0x03209e1f _dispatch_client_callout + 14 
    15 libdispatch.dylib     0x031f0981 _dispatch_main_queue_callback_4CF + 610 
    16 CoreFoundation      0x02855f3e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14 
    17 CoreFoundation      0x02814d40 __CFRunLoopRun + 2256 
    18 CoreFoundation      0x028141ab CFRunLoopRunSpecific + 443 
    19 CoreFoundation      0x02813fdb CFRunLoopRunInMode + 123 
    20 GraphicsServices     0x051a524f GSEventRunModal + 192 
    21 GraphicsServices     0x051a508c GSEventRun + 104 
    22 UIKit        0x00f41e16 UIApplicationMain + 1526 
    23 Lifetape       0x000ce36d main + 141 
    24 libdyld.dylib      0x03235ac9 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

Обновите свой вопрос и сообщите точное и полное сообщение. Подробности имеют значение. – rmaddy

+0

один раз использовать эту строку [[NSMutableDictionary alloc] initWithDictionary: response]; вместо (NSMutableDictionary *) [response mutableCopy]; –

+0

перед выполнением mutablecopy напишите условие if [response isKindOfClass: [класс NSDictionary]] –

ответ

1

Вот ваш словарь ответа является NSDictionary коллекции типа, так что не имеет никакого выбора, как SetObject, поэтому он дает вам это использование ошибок

if(response && [response isKindOfClass:[NSDictionary class]]){ 
       NSMutableArray *lifeArray = [[NSMutableArray alloc] init]; 
       NSMutableDictionary *responseDict = [NSMutableDictionary dictionaryWithDictionary:response]; 
       [responseDict setObject:@"life" forKey:@"label"]; 
} 

и он будет работать, но убедитесь, что ответ - это ваш объект типа словаря. поскольку ошибка, которую вы опубликовали, четко говорит о том, что ваш ответ представляет собой массив, а не словарь.

+0

Я вызываю setObject на responseDict, который является NSMutableDictionary а не от ответа. mutableCopy дает вам NSMutableDictionary. –

+0

bro Значит, я думаю, что ответ - это массив, а не словарь – iHulk

+0

после проверки ответа, я думаю, что это массив, не словарь – Smile

0

Ваш ответ выглядит как класс NSArray, поэтому попробуйте под кодом.

if([response isKindOfClass:[NSArray Class]]){ 
NSLog(@"Array"); 
} 
else if([response isKindOfClass:[NSDictionary Class]]){ 
NSLog(@"Dictionary"); 
} 

Теперь управляйте своим кодом в соответствии с журналом.

Смежные вопросы