我创建了一个NSMutableArray并在viewDidLoad
@property (nonatomic, copy) NSMutableArray *arrayDATA;
- (void)viewDidLoad {
[super viewDidLoad];
_arrayDATA = [[NSMutableArray alloc] init];
}
我通过服务器使用AFNetworking请求json,json格式就像这样
{
"code": 0,
"statu": "success",
"datalist": [
{
"id": "1",
"name": "ADPL"
},
{
"id": "2",
"name": "GOOG"
},
{
"id": "3",
"name": "LIKE"
}
]
}
我将响应数据提供给arrayDATA,就像这样
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"application/json"];
NSDictionary *params = @{@"username":username, @"password":password};
[manager POST:URL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
[self setArrayDATA:[responseObject objectForKey:@"datalist"]]; // works fine
[_arrayDATA addObject:[responseObject objectForKey:@"datalist"]]; // will crash
[self.tableview reloadData];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
正如代码评论所说
如果我使用[self setArrayDB:[responseObject objectForKey:@"datalist"]];
,该函数运行良好,但如果我使用[_arrayDB addObject:[responseObject objectForKey:@"datalist"]];
,函数将崩溃,这里使用addObject的正确方法是什么?
崩溃信息
[__NSSingleObjectArrayI objectForKey:]: unrecognized selector sent to instance 0x60000001a940
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleObjectArrayI objectForKey:]: unrecognized selector sent to instance 0x60000001a940'
答案 0 :(得分:0)
我认为有一个错误,arrayDATA和arrayDB是相同的。
但崩溃是因为你正在设置元素" datalist" responseObject对arrayDB的响应。然后arrayDB是NSArray,而不是NSMutableArray。所以你不能添加更多的元素。
另一方面,如果后者要设置一个指向新对象的新指针,则不需要在viewDidLoad中初始化可变数组。
尝试使用以下命令更改setArrayDB:行:
self.arrayDB = [NSMutableArray arrayWithArray:[responseObject objectForKey:@"datalist"]];
答案 1 :(得分:0)
首先,[responseObject objectForKey:@"datalist"]
的返回类型是Array而不是NSDictionary。
第1点
[self setArrayDATA:[responseObject objectForKey:@"datalist"]]; // works fine
这很好,因为您正在为数组设置数组。
第2点
这会因为您将数组添加为addObject
而崩溃。
[_arrayDATA addObject:[responseObject objectForKey:@"datalist"]];
您应该使用以下方法使其正常工作
[_arrayDATA addObjectsFromArray:[responseObject objectForKey:@"datalist"]];
^^^^^^^^^^^^^^^^^^^