前言
2017年9月23日,写在 iPhone8和iPhone X发布10日之际。给公司处于业务膨胀期,导致近期一直很忙,晚上经常加班到10点,加班到凌晨2点钟也是常有发生。今天恰逢周六,深感有必要给自己充充电了,于是网上翻看了下关于Xcode 9新特性的一系列文章,其中有说道Main Thread Checker(翻译过来大概就是主线程检查器)。关于这个名词,网上还没有文章介绍。结合官方文档,我在这里简单的概括下。如果哪里有纰漏,还请阅读者给出提醒。
看了官方文档上的介绍,着实认为这个技术非常棒。这个Main Thread Checker的作用就是:可以帮助开发者检查出那些应该在主线程调用但却在后台线程调用了的API。其涉及到Appkit、UIKit以及其他一些只应该在主线程别调用的API。
原理
关于Main Thread Checker的工作原理,文档上并未给出一个详细的介绍,只是用一句话进行了概括,这很符合苹果爸爸的风格。其大意是指:在app启动时,Main Thread Checker会用被调用方法implementation的一个替换版本动态的替换那些只应该在主线程调用的方法implementation。而这个方法的implementation的替换版本可以在调用之前预先检查出其是否在主线程上调用。
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不需要重新编译,并且可以和现有的二进制文件一起使用。通过注入一个动态库你可以把他运行在一个macOS app上,比如可以应用在CI系统上。这个库的路径是: /Applications/Xcode.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
性能方面
文档上说,Main Thread Checker的性能影响非常小,只有1%~2%的CPU开销和不到0.1秒的进程启动开销。
打开方式
正因为Main Thread Checker的性能开销非常小。所以在xcode中调试app的时候,Main Thread Checker会自动打开。当然我们也可以手动关闭。关闭方式:
Edit Scheme -> Diagnostics -> RuntimelyAPI Checking -> Main Thread Checker。去掉Main Thread Checker前面的对勾。如下图:
实践
接下来,针对于这个所谓的Main Thread Checker,我进行了以下实践。在后台线程创建了一个UIView,然后运行程序,发现问题代码被highlighted。并且提示:-[UIView init] must be used from main thread only。如下图:
如果我们不但勾选了Main Thread Checker并且也勾选了pause on issues。那么就会得到如下提示,并且程序会停止在问题代码那一行,不再继续执行:
结尾
以上就是关于Main Thread Checker的简单介绍,后续有关于Main Thread Checker的详细更新,也会同步到本篇文章上。
如果有技术问题,欢迎加入QQ群进行交流,群聊号码:194236752。