【问题标题】:NSMutableDictionary setobject: forkey: crashes with unrecognised selector messageNSMutableDictionary setobject:forkey:因无法识别的选择器消息而崩溃
【发布时间】:2015-01-08 22:50:47
【问题描述】:

对于下面的代码sn-p: 错误发生在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 核心基础 0x028fbdf6 __exceptionPreprocess + 182 1 libobjc.A.dylib 0x02557a97 objc_exception_throw + 44 2核心基础0x02903a75-[NSObject(NSObject)不识别选择器:]+277 3 核心基础 0x0284c9c7 ___转发___ + 1047 4 核心基础 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 核心基础 0x02855f3e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14 17 核心基础 0x02814d40 __CFRunLoopRun + 2256 18 核心基础 0x028141ab CFRunLoopRunSpecific + 443 19 核心基础 0x02813fdb CFRunLoopRunInMode + 123 20 图形服务 0x051a524f GSEventRunModal + 192 21 图形服务 0x051a508c GSEventRun + 104 22 UIKit 0x00f41e16 UIApplicationMain + 1526 23 Lifetape 0x000ce36d 主要 + 141 24 libdyld.dylib 0x03235ac9 开始 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止

【问题讨论】:

  • 使用准确且完整的错误消息更新您的问题。细节很重要。
  • 一旦使用这一行 [[NSMutableDictionary alloc]initWithDictionary:response];而不是 (NSMutableDictionary *)[response mutableCopy];
  • 在做 mutablecopy 之前写下 if 条件 [response isKindOfClass:[NSDictionary class]]
  • 读取错误。 response 是一个数组,不是字典。
  • 我认为你的responseNSArray 检查if([response isKindOfClass:[NSArray Class]]) else if([response isKindOfClass:[NSDictionary Class]])

标签: ios nsdictionary nsmutabledictionary


【解决方案1】:

这里你的响应字典是一个 NSDictionary 类型的集合,所以它没有任何像 setObject 这样的选择器,这就是它给你这个错误使用的原因

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

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

【讨论】:

  • 我在 responseDict 上调用 setObject,它是 NSMutableDictionary 而不是响应。 mutableCopy 给你一个 NSMutableDictionary。
  • 兄弟的意思是我认为你的响应是一个数组而不是字典
  • 一旦清楚地检查响应我认为它是一个数组而不是字典
【解决方案2】:

你的响应看起来像 NSArray 类,所以试试下面的代码。

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

现在根据日志管理您的代码。

【讨论】:

  • Class 的这两种用法应该是小写的class
猜你喜欢
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2019-10-24
  • 2017-04-26
  • 1970-01-01
相关资源
最近更新 更多