dispatch_after引起的内存释放异常闪退

dispatch_after 要慎用,避免页面返回时,内存不能正常释放,导致闪退。
最近我遇到一个很奇怪的闪退。当app从A页面进入B页面,然后返回A页面就出现了闪退。只出现在iPhone6 iOS13系统手机闪退。
在这里插入图片描述
最后定位出的代码时原来的代码是:进入B页面发送一个请求,在请求响应回来后使用dispatch_after延迟发送另一个请求,估计是为了解决请求小菊花显示问题。结果就出现了闪退。分析:当你把这个block加入主进程队列,结果你的页面返回上一个页面,就可能出现内存释放异常。
所以建议别采用这种方式连续发送请求。慎用或不用dispatch_after,别为了麻烦产生更大的问题,若没有其它手段,还不如用NSTimer这样的官方定时器,当然你会用socket可以用它写一个定时器。搞不太明白技术能不用尽量不用。像这样一般的手机使用不闪退,但是在特定的手机就闪退了。这种闪退才是最麻烦。定义不到具体代码,没有闪退日志。
出问题的代码如下:

    @weakify(self);
    [LYRequestManager putWithURLString:[NSString stringWithFormat:@"fang/leyou/coupon/trans/boundary/update?couponAmount=%@&transId=%@",self.addcount,self.activityId] parameters:@{} success:^(id response) {
        NSLog(@"%@",response);
        [SVProgressHUD showInfoWithStatus:response[@"msg"]];
        @strongify(self);
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            @strongify(self);
            self.dataArr = [[NSMutableArray alloc]init];
            self.dataArray = [[NSMutableArray alloc]init];
            self.pageNo = @"1";
            [self requestCro];
        });
    } failure:^(NSError * error) {
        NSLog(@"%@",error);
    }];

dispcth_after 是将block 中的任务延迟添加到它将要执行的队列中去,而并不一定添加到队列中就立即会去执行任务。

图中表示是在5秒中后将任务添加到主队列中,如果主队列中还有另外的任务假设A、B 要执行,那么这个任务会在任务A、B 执行完后才会开始执行。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值