NSMutableDictionary setobject:forkey:崩溃,带有无法识别的选择器消息

时间:2014-11-12 06:54:16

标签: ios nsdictionary 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复制后,变量NSMutableDictionarymutableCopy

错误讯息:

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

2 个答案:

答案 0 :(得分:1)

这里你的响应字典是一个NSDictionary类型集合,因此它没有像setObject这样的选择器,这就是为什么它会给你这个错误使用

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

它会起作用,但要确保响应是你的字典类型对象。因为您发布的错误清楚地表明您的回复是一个数组而不是字典。

答案 1 :(得分:0)

您的回复看起来像NSArray类,请尝试下面的代码。

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

现在按日志管理您的代码。