关于MJ,行业内恐怕都听过大名,据博主第一次听说到使用到现在也有四五年的历史了,经历这么长时间,MJ可谓依然是强盛不衰,很多自定义的刷新都是通过MJ扩展出来的,博主这里就不一一解释了。
早在几年前,博主刚刚使用MJ的时候就曾碰到过MJ刷新导致崩溃的问题,但是不怎么在意,实至今日,又再次使用MJ,也遇到了同样的问题,先来看看博主是怎么写的:
_circleTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNavigationBarHeight) style:UITableViewStyleGrouped]; _circleTableView.delegate = self; _circleTableView.dataSource = self; _circleTableView.estimatedRowHeight = 120; _circleTableView.rowHeight = UITableViewAutomaticDimension; _circleTableView.separatorStyle = UITableViewCellSelectionStyleNone; [self.view addSubview:_circleTableView]; MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; // 设置自动切换透明度(在导航栏下面自动隐藏) header.automaticallyChangeAlpha = YES; // 隐藏时间 header.lastUpdatedTimeLabel.hidden = YES; // 设置header self.circleTableView.mj_header = header; self.circleTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; #pragma mark - loadNewData - (void)loadNewData { _page = 1; [_tucaoDataArray removeAllObjects]; [self requestData]; } #pragma mark - loadMoreData - (void)loadMoreData { _page++; [self requestData]; }
乍一看似乎并无不妥,很多人也是这么用的,但是恰恰是这种写法使得在刷新的时候导致数组越界的崩溃,原因就是在loadNewData方法中还未请求到数据就删除了数据源,如果在请求途中tableview滚动,数据源没有数据,为空,直接就崩溃了。如果tableview不滚动,也存在一定的几率会崩溃,属于偶发性的。
最好的做法就是在请求到数据后再删除数据,存入新数据,不要提前删除数据。实在是一个低级错误。