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

时间:2017-01-04 21:00:01

标签: ios afnetworking

使用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 个答案:

答案 0 :(得分:2)

  1. 您永远不应该信任用户输入,来自网络的数据以及其他可疑来源的第三方数据,因此您应该始终检查您是否得到了您的期望。即使您认为responseObjectNSDictionary,也必须检查它以确保并正确处理可能的错误。

  2. 在您的示例中(根据崩溃消息)responseObject属于NSDictionary类型。此类没有-[arrayForKey:]方法。当您尝试调用未在层次结构中实现的方法(发送消息,实际上)时,您将获得该类型的异常 - “无法识别的选择器发送到实例”。此外,check this article关于转发扩展信息。

  3. 修正片段:

    [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);
    }];