- [__ NSArrayM objectForKey:]:无法识别的选择器发送到实例0x9d0d720

时间:2016-11-19 10:29:01

标签: ios objective-c iphone xcode nsarray

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
     [jsonArray removeAllObjects];
     NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
     responseData = nil;
     NSMutableArray *sdf = [(NSDictionary*)[responseString JSONValue] objectForKey:@"DataTable"];
     NSMutableArray * myArray = [[NSMutableArray alloc] init];
     NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];
     if (([(NSString*)sdf isEqual: [NSNull null]])) {

        // Showing AlertView Here
     }else {
        for (int i=0; i<[sdf count]; i++) {
           myDict=[sdf objectAtIndex:i];
           [myArray addObject:[myDict objectForKey:@"RxnCustomerProfile"]];
     }

     jsonArray=[myArray mutableCopy];
     NSMutableDictionary *dict=[jsonArray objectAtIndex:0];
     if ([dict count]>1) {
        // Showing AlertView Here
      }
   }
}

大家好,我对-[__NSArrayM objectForKey:]:有疑问。     试图解决但没有得到更好的解决方案。请帮帮我     找到解决方案。在此先感谢

以下是问题

  

由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSArrayM objectForKey:]:无法识别的选择器发送到实例0x19731d40'

5 个答案:

答案 0 :(得分:3)

这是一个调试问题,没有人可以真正解决它,因为你使用的是定义和值未知的非局部变量,没有提到你正在使用SBJSON(我猜)等等但是,让我们看看我们是否可以给你一些指示。你的错误:

[__NSArrayM objectForKey:]: unrecognized selector sent to instance

这告诉您已将字典方法(objectForKey)发送到数组(__NSArrayM)。所以,当你认为自己有一本字典时,你就会有一个数组。

现在您声明并分配字典:

NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];

然后分配给它:

myDict=[sdf objectAtIndex:i];

因此,这会丢弃您分配的字典,而是分配数组i中索引为sdf的任何内容。你如何知道而不是思考,那么数组元素是一个字典?你不测试检查......

那么sdf来自哪里?这一行:

NSMutableArray *sdf = [(NSDictionary*)[responseString JSONValue] objectForKey:@"DataTable"];

所以在某个未知字符串上调用JSONValue假设结果是字典(可能是数组吗?还是失败?),查找键(做错了)来自这一行?),假定结果是一个数组。

所以你需要做的就是去测试所有这些假设,在某个地方你会找到一个你认为有字典的数组。

快乐狩猎!

答案 1 :(得分:1)

你在阵列格式中发现了值,并且你在字典中集成了方法。

答案 2 :(得分:0)

您不需要迭代键,dict的值可以直接将值传递给其他部分内的数组,如:

myArray = [sdf objectForKey:@"RxnCustomerProfile"];

RxnCustomerProfile本身包含数组而不是字典。

在代码下方更改您的if else部分:

if (([(NSString*)sdf isEqual: [NSNull null]])) {

    // Showing AlertView Here
}else {
    myArray = [sdf objectForKey:@"RxnCustomerProfile"];
}

答案 3 :(得分:0)

  NSMutableArray *sdf = [(NSDictionary*)[responseString JSONValue]   objectForKey:@"DataTable"];

检查Sdf

   if([sdf isKindOfClass:[NSDictionary class]])
   {
    NSLog(@"Dictionary");
   }

   else if([sdf isKindOfClass:[NSArray class]]) 
   {
    NSLog(@"NSArray");
   }
    else if([sdf isKindOfClass:[NSMutableArray class]]) 
   {
    NSLog(@"NSMutableArray");
   }

答案 4 :(得分:0)

首先,好像你的json实际上没有正确格式化。在不知道responseData看起来是什么样的情况下,很难确切地说出什么是错误的。但在您的代码中,有一些领域可以改进。

首先,您不需要使用[responseString JSONValue]。您可以使用

完全将其短路
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
NSArray *sdf = responseDictionary[@"DataTable"];

现在,其余的全部取决于responseData中的数据。

但是你可以让你的代码更清洁(如果我理解你正在努力实现的目标:

NSMutableArray *myArray = [NSMutableArray array];
if ([sdf isEqual:[NSNull null]]) {
    // Showing AlertView here
} else {
    for (NSDictionary *myDict in sdf) {
        [myArray addObject:dict[@"RxnCustomerProfile"]];
    }
}

// No idea what you're trying to achieve here, but here goes:
jsonArray = [myArray mutableCopy];
NSDictionary *dict = jsonArray.first;
if (dict.count > 1) {
    // Showing AlertView here
}

有些事情需要注意。你没有明显的理由非常自由地使用NSMutableArrayNSMutableDictionary。如果您实际更改数组或字典,请仅使用mutable。