dispatch_after 要慎用,避免页面返回时,内存不能正常释放,导致闪退。

最近我遇到一个很奇怪的闪退。当app从A页面进入B页面,然后返回A页面就出现了闪退。只出现在iPhone6 iOS13系统手机闪退。

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


最后定位出的代码时原来的代码是:进入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 执行完后才会开始执行。

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