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

目录
相关文章
|
7月前
|
存储 缓存 算法
深入浅出JVM(二)之运行时数据区和内存溢出异常
深入浅出JVM(二)之运行时数据区和内存溢出异常
|
3月前
|
Java C++
Java内存区域于内存溢出异常
这篇文章详细解释了Java虚拟机的内存区域划分、各区域的作用以及可能遇到的内存溢出异常情况。
48 0
|
4月前
|
存储 Java 编译器
Java内存区域与内存溢出异常 - 运行时数据区
【8月更文挑战第2天】Java运行时数据区包括:1) 程序计数器:记录线程执行字节码的行号,线程私有;2) Java虚拟机栈:描述方法执行的内存模型,线程私有,深度过大抛出`StackOverflowError`;3) 本地方法栈:服务于Native方法,线程私有;4) Java堆:所有线程共享,对象实例在此分配内存;5) 方法区:存储类信息、常量等数据;6) 运行时常量池:方法区的一部分,存放字面量和符号引用。不当使用如无限创建对象或过度递归调用会导致各种内存溢出错误。
|
5月前
|
Arthas 存储 监控
JVM内存问题之JNI内存泄漏没有关联的异常类型吗
JVM内存问题之JNI内存泄漏没有关联的异常类型吗
|
5月前
|
缓存 算法 Java
JVM内存溢出(OutOfMemory)异常排查与解决方法
JVM内存溢出(OutOfMemory)异常排查与解决方法
|
5月前
|
测试技术 API Android开发
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应
|
Kubernetes Java API
|
7月前
|
C++
C++多线程场景中的变量提前释放导致栈内存异常
C++多线程场景中的变量提前释放导致栈内存异常
71 0
|
7月前
|
存储 算法 Java
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
58 0
|
7月前
|
计算机视觉 C++
win7系统OpenCV读取图片内存位置异常
win7系统OpenCV读取图片内存位置异常
156 0