对于以下代码段: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
}

请注意,变量responseDictNSMutableDictionary,因为已通过mutableCopy复制。

错误信息:

2014-11-12 12:16:08.534 Lifetape [84381:508759]-[__ NSCFArray setObject:forKey:]:无法识别的选择器已发送到实例0x7a296700
2014-11-12 12:16:08.536 Lifetape [84381:508759] ***由于未捕获的异常'NSInvalidArgumentException'终止了应用程序,原因:'-[__ NSCFArray setObject:forKey:]:无法识别的选择器已发送至实例0x7a296700'
***首先抛出调用堆栈:
(
0 CoreFoundation 0x028fbdf6 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x02557a97 objc_exception_throw + 44
2 CoreFoundation 0x02903a75-[NSObject(NSObject)didNotRecognizeSelector:] + 277
3 CoreFoundation 0x0284c9c7 ___转发___ + 1047
4 CoreFoundation 0x0284c58e _CF_forwarding_prep_0 + 14
5 Lifetape 0x000dfb83 __50- [LTTimeLineTableViewController getTimeIntervals:] _ block_invoke + 307
6 Lifetape 0x0014cedb-[MethodInvoker可能是InvokeCallback] + 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主+ 141
24 libdyld.dylib 0x03235ac9开始+ 1
)
libc ++ abi.dylib:以NSException类型的未捕获异常终止

最佳答案

在这里,您的响应字典是NSDictionary类型集合,因此它没有像setObject这样的任何选择器,这就是为什么它给您这种错误使用的原因

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

并且可以正常工作,但请确保响应是您的字典类型对象。因为您发布的错误清楚地表明您的响应是一个数组而不是字典。

关于ios - NSMutableDictionary setobject:forkey:因无法识别的选择器消息而崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26880988/

10-09 01:25