-[__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'
您永远不应该相信用户输入、来自网络的数据和其他来源可疑的第 3 方数据,因此您应该始终检查您是否得到了您期望的结果。即使您假设 responseObject
是一个 NSDictionary
,您也必须检查它以便确定并正确处理可能的错误。
在您的示例中(根据崩溃消息)responseObject
是 NSDictionary
类型。此 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);
}];
我在使用 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'
您永远不应该相信用户输入、来自网络的数据和其他来源可疑的第 3 方数据,因此您应该始终检查您是否得到了您期望的结果。即使您假设
responseObject
是一个NSDictionary
,您也必须检查它以便确定并正确处理可能的错误。在您的示例中(根据崩溃消息)
responseObject
是NSDictionary
类型。此 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);
}];