如果使用NSMutableArray接受json,则崩溃

时间:2018-01-16 09:04:00

标签: ios objective-c uitableview nsmutablearray nsarray

我创建了一个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'

2 个答案:

答案 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"]];
            ^^^^^^^^^^^^^^^^^^^