前言
2017年9月23日,寫在 iPhone8和iPhone X發(fā)布10日之際。給公司處于業(yè)務(wù)膨脹期,導(dǎo)致近期一直很忙,晚上經(jīng)常加班到10點(diǎn),加班到凌晨2點(diǎn)鐘也是常有發(fā)生。今天恰逢周六,深感有必要給自己充充電了,于是網(wǎng)上翻看了下關(guān)于Xcode 9新特性的一系列文章,其中有說(shuō)道Main Thread Checker(翻譯過(guò)來(lái)大概就是主線程檢查器)。關(guān)于這個(gè)名詞,網(wǎng)上還沒有文章介紹。結(jié)合官方文檔,我在這里簡(jiǎn)單的概括下。如果哪里有紕漏,還請(qǐng)閱讀者給出提醒。
看了官方文檔上的介紹,著實(shí)認(rèn)為這個(gè)技術(shù)非常棒。這個(gè)Main Thread Checker的作用就是:可以幫助開發(fā)者檢查出那些應(yīng)該在主線程調(diào)用但卻在后臺(tái)線程調(diào)用了的API。其涉及到Appkit、UIKit以及其他一些只應(yīng)該在主線程別調(diào)用的API。
原理
關(guān)于Main Thread Checker的工作原理,文檔上并未給出一個(gè)詳細(xì)的介紹,只是用一句話進(jìn)行了概括,這很符合蘋果爸爸的風(fēng)格。其大意是指:在app啟動(dòng)時(shí),Main Thread Checker會(huì)用被調(diào)用方法implementation的一個(gè)替換版本動(dòng)態(tài)的替換那些只應(yīng)該在主線程調(diào)用的方法implementation。而這個(gè)方法的implementation的替換版本可以在調(diào)用之前預(yù)先檢查出其是否在主線程上調(diào)用。
At app launch, the Main Thread Checker dynamically replaces the implementations of methods that should only be called on the main thread with a version that prepends the check. Methods known to be safe for use on background threads are excluded from this check.
并且,文檔中有介紹,Main Thread Checker不需要重新編譯,并且可以和現(xiàn)有的二進(jìn)制文件一起使用。通過(guò)注入一個(gè)動(dòng)態(tài)庫(kù)你可以把他運(yùn)行在一個(gè)macOS app上,比如可以應(yīng)用在CI系統(tǒng)上。這個(gè)庫(kù)的路徑是: /Applications/Xcode.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
性能方面
文檔上說(shuō),Main Thread Checker的性能影響非常小,只有1%~2%的CPU開銷和不到0.1秒的進(jìn)程啟動(dòng)開銷。
打開方式
正因?yàn)镸ain Thread Checker的性能開銷非常小。所以在xcode中調(diào)試app的時(shí)候,Main Thread Checker會(huì)自動(dòng)打開。當(dāng)然我們也可以手動(dòng)關(guān)閉。關(guān)閉方式:
Edit Scheme -> Diagnostics -> RuntimelyAPI Checking -> Main Thread Checker。去掉Main Thread Checker前面的對(duì)勾。如下圖:
實(shí)踐
接下來(lái),針對(duì)于這個(gè)所謂的Main Thread Checker,我進(jìn)行了以下實(shí)踐。在后臺(tái)線程創(chuàng)建了一個(gè)UIView,然后運(yùn)行程序,發(fā)現(xiàn)問(wèn)題代碼被highlighted。并且提示:-[UIView init] must be used from main thread only。如下圖:
如果我們不但勾選了Main Thread Checker并且也勾選了pause on issues。那么就會(huì)得到如下提示,并且程序會(huì)停止在問(wèn)題代碼那一行,不再繼續(xù)執(zhí)行:
結(jié)尾
以上就是關(guān)于Main Thread Checker的簡(jiǎn)單介紹,后續(xù)有關(guān)于Main Thread Checker的詳細(xì)更新,也會(huì)同步到本篇文章上。
如果有技術(shù)問(wèn)題,歡迎加入QQ群進(jìn)行交流,群聊號(hào)碼:194236752。