使用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'
答案 0 :(得分:2)
您永远不应该信任用户输入,来自网络的数据以及其他可疑来源的第三方数据,因此您应该始终检查您是否得到了您的期望。即使您认为responseObject
是NSDictionary
,也必须检查它以确保并正确处理可能的错误。
在您的示例中(根据崩溃消息)responseObject
属于NSDictionary
类型。此类没有-[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);
}];