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