- [__ NSDictionaryI arrayForKey:]:发送到实例的无法识别的选择器

问题描述:

使用AFNetworking 3.0库时出现此错误。代码:- [__ NSDictionaryI arrayForKey:]:发送到实例的无法识别的选择器

[manager GET:@"..." 
     parameters:nil 
     progress:nil 
     success:^(NSURLSessionTask *task, id responseObject) { 
      NSArray *result = [responseObject arrayForKey:@"items"]; 

      self.objects = [NSMutableArray arrayWithArray:responseObject]; 
      [self.tableView reloadData]; 
     } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

当我使用arrayWithArray,我得到:

[NSArray initWithArray:range:copyItems:]: array argument is not an NSArray' 
+0

你得到什么错误?我只在这里看到你的代码。 – fsb

+2

错误消息明确指出'responseObject'是一个不响应'arrayForKey'的字典。在文档中快速查看,发现有两个类对'arrayForKey'作出响应:'NSUserDefaults'和'NSUbiquitousKeyValueStore' – vadian

+0

+1 @vadian:'reponseObject'是一个'NSDictionary'对象。承认,它有一个键“@”项的价值“,并且该值是一个”NSArray“对象,你应该至少做self.objects = [NSMutableArray arrayWithArray:result];'而不是'self.objects = [NSMutableArray arrayWithArray:responseObject];'... – Larme

  1. 你千万不要相信用户的输入,即来自于网络,并与来历不明的其他第三方数据的数据,所以你应该总是检查你是否得到你所期望的。即使您假设responseObjectNSDictionary,您也必须检查它以确保并正确处理可能的错误。

  2. 在你的例子中(根据崩溃消息)responseObjectNSDictionary类型。该课程没有-[arrayForKey:]方法。当您尝试调用未在层次结构中实现的方法(发送消息,实际上是)时,会出现该类型的异常 - “发送给实例的无法识别的选择器”。另外,关于转发扩展信息的check this article

固定片段:

[manager GET:@"..." 
parameters:nil 
    progress:nil 
    success:^(NSURLSessionTask *task, id responseObject) { 
    if ([responseObject isKindOfClass:[NSDictionary class]]){ 
     NSDictionary *dic = (NSDictionary*)responseObject; 
     id items = dic[@"items"]; 
     if ([items isKindOfClass:[NSArray class]]){ 
      self.objects = [(NSArray*)items mutableCopy]; 
      [self.tableView reloadData]; 
     } else { 
      NSLog(@"Error: \"items\" is not an array"); 
     } 
    } else { 
     NSLog(@"Error: unexpected type of the response object"); 
    } 
} failure:^(NSURLSessionTask *operation, NSError *error) {    
    NSLog(@"Error: %@", error); 
}]; 
+0

+1,因为你帮了忙。顺便说一句,我的数据总是明确的..这是我自己的PHP文件,它总是以JSON形式出现。感谢与[]的解决方案。 –