美文网首页
关于莫名其妙异步线程调用webkit崩溃

关于莫名其妙异步线程调用webkit崩溃

作者: littlewish | 来源:发表于2017-11-06 11:20 被阅读127次

背景:

app中时常发现一些layer相关的处理出现在非主线程上会引发一些崩溃,在判断出了web相关的layer能在 webThread线程处理之外,非webThread线程的layer的display在主线程执行,在我们处理这个问题的时候遇到了另外一个问题:

现场大概是这样:

if (![xxx isKindOfClass:[UIWebView class]] || ![xxx isKindOfClass:[WKWebView class]]) {
        //判断线程是不是主线程。不是则切到主线程display
    }

我们发现当不是主线程走到这里的时候,会在if判断那一行崩溃。

后续我们排查原因,发现如果UIWebView或者WKWebView没有加载过的话,调用[UIWebView class]或者是[WKWebView class]的时候,会调起webkit的一些初始化操作。这些操作是在非主线程下进行的,而导致了崩溃。

我们修改为

if (![xxx isKindOfClass:NSClassFromString(@"UIWebView")] || ![xxx isKindOfClass:NSClassFromString(@"WKWebView")]) {
            //判断线程是不是主线程。不是则切到主线程display
        }

发现这样判断的话,不会调起webkit的一些初始化操作。当初发现这个的时候还有点震惊,可能也是自己的知识点不够全面。

猜测

Class的调用方法触发了runtime的加在类,发现没有加载历史,所以去加载相关的类库到运行时内。而单纯的NSClassFromString(@"WKWebView"),只是一个类名的映射关系,而不会去加载。

相关文章

  • 关于莫名其妙异步线程调用webkit崩溃

    背景: app中时常发现一些layer相关的处理出现在非主线程上会引发一些崩溃,在判断出了web相关的layer能...

  • 异步执行原理简要总结

    异步http调用,线程池调用简要原理 主线程封装一个FutureTask给异步框架, 异步框架有管理类管理主线程传...

  • 实现异步转同步

    极客时间-《Java并发编程实战》学习笔记 异步方法:调用方法,在方法中启动子线程异步调用:启动子线程调用方法异步...

  • SpringBoot线程池异步调用

    异步调用介绍 异步调用异步调用就是在不阻塞主线程的情况下执行高耗时方法 常规异步通过开启新线程实现 在Spring...

  • iOS GCD多线程

    程序中同步和异步是什么意思?有什么区别? 解释一:异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调...

  • 阻塞/非阻塞,同步/异步

    同步与异步(线程间调用) 同步与异步是对应于调用者与被调用者,它们是线程之间的关系,两个线程之间要么是同步的,要么...

  • 异步与编程语言的关系

    异步方式必然会在线程上完成切换,而线程中维护的栈信息(调用关系、各层调用的局部变量等)会在每次异步调用时释放。大部...

  • 异步调用Feign接口空指针问题

    异步调用Feign接口空指针问题原因: Feign接口的Request 默认是主线程和子线程不共享的,当异步调用F...

  • node相关基础知识

    同步和异步 同步是指发起调用之后主线程只能挂起,调用者主动等待这个调用的结果 异步是指发起调用之后主线程可以作别的...

  • 2018-03-13 Spring中的异步调用

    异步方法调用 异步方法调用或异步方法模式是(多线程)面向对象程序设计中用于异步调用对象的潜在的长期运行方法的一种设...

网友评论

      本文标题:关于莫名其妙异步线程调用webkit崩溃

      本文链接:https://www.haomeiwen.com/subject/drokmxtx.html