背景:
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"),只是一個類名的映射關系,而不會去加載。