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

背景:

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"),只是一个类名的映射关系,而不会去加载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容