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

-[__NSDictionaryI arrayForKey:]: unrecognized selector sent to instance

我在使用 AFNetworking 3.0 库时遇到此错误。代码:

[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'
  1. 您永远不应该相信用户输入、来自网络的数据和其他来源可疑的第 3 方数据,因此您应该始终检查您是否得到了您期望的结果。即使您假设 responseObject 是一个 NSDictionary,您也必须检查它以便确定并正确处理可能的错误。

  2. 在您的示例中(根据崩溃消息)responseObjectNSDictionary 类型。此 class 没有 -[arrayForKey:] 方法。当您尝试调用未在层次结构中实现的方法(发送消息,实际上)时,您会得到该类型的异常 – "unrecognized selector sent to instance"。此外,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);
}];