iOS开发 - 关于MJRefresh刷新崩溃的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CodingFire/article/details/81950033

关于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不滚动,也存在一定的几率会崩溃,属于偶发性的。
最好的做法就是在请求到数据后再删除数据,存入新数据,不要提前删除数据。实在是一个低级错误。

猜你喜欢

转载自blog.csdn.net/CodingFire/article/details/81950033