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

简介: 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 执行完后才会开始执行。

目录
相关文章
|
1月前
|
存储 缓存 算法
深入浅出JVM(二)之运行时数据区和内存溢出异常
深入浅出JVM(二)之运行时数据区和内存溢出异常
|
7月前
|
Kubernetes Java API
|
1月前
|
C++
C++多线程场景中的变量提前释放导致栈内存异常
C++多线程场景中的变量提前释放导致栈内存异常
31 0
|
1月前
|
存储 算法 Java
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
42 0
|
1月前
|
计算机视觉 C++
win7系统OpenCV读取图片内存位置异常
win7系统OpenCV读取图片内存位置异常
38 0
|
7月前
|
存储 缓存 内存技术
【CSAPP】虚拟内存 | 地址空间 | 页表内存保护 | 页错误引发异常逐出 (evicted)
【CSAPP】虚拟内存 | 地址空间 | 页表内存保护 | 页错误引发异常逐出 (evicted)
39 0
|
IDE Java 开发工具
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
85 0
|
存储 算法 Java
JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
45 0
|
存储 数据可视化 Go
记一次线上Go服务内存占用异常问题排查
记一次线上Go服务内存占用异常问题排查
415 0
记一次线上Go服务内存占用异常问题排查
|
存储 Java 数据库连接
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累
JVM之常见内存溢出(OutOfMemoryError)异常 ✨ 每日积累