- [__ 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'
答
你千万不要相信用户的输入,即来自于网络,并与来历不明的其他第三方数据的数据,所以你应该总是检查你是否得到你所期望的。即使您假设
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);
}];
+0
+1,因为你帮了忙。顺便说一句,我的数据总是明确的..这是我自己的PHP文件,它总是以JSON形式出现。感谢与[]的解决方案。 –
你得到什么错误?我只在这里看到你的代码。 – fsb
错误消息明确指出'responseObject'是一个不响应'arrayForKey'的字典。在文档中快速查看,发现有两个类对'arrayForKey'作出响应:'NSUserDefaults'和'NSUbiquitousKeyValueStore' – vadian
+1 @vadian:'reponseObject'是一个'NSDictionary'对象。承认,它有一个键“@”项的价值“,并且该值是一个”NSArray“对象,你应该至少做self.objects = [NSMutableArray arrayWithArray:result];'而不是'self.objects = [NSMutableArray arrayWithArray:responseObject];'... – Larme