最近在弄 iOS 下的音视频 SDK 的移植和适配,该 SDK 是基于 WebRTC 项目但并未使用官方的 ninja
编译脚本,而是使用的 cmake
作为编译工具。在 WebRTC 的音频模块中引用了一个 UIDevice
的 Category
来做设备类型的判断,编译和链接都没有出现问题,但在运行时出现了 selector not recognized
的异常。该异常可以从我之前的 《iOS 运行时之消息转发机制》 文章中了解到,由于对象接收到了一个无法处理该 selector
,经过消息转发后还未得到处理,会在 doesNotRecognizeSelector
方法中抛出的异常。
Category
以及一些其他的工具类被编译在一个基础的静态库中,在音频模块中引用该静态库,除了 Category
代码其他所有的代码都能正常编译、链接以及运行,但唯独 Category
在运行时出现了错误,由于 Category
的 Objective-C 语言的特性,最开始我以为需要为编译器添加针对 Category
的参数,找了很久也没找到针对 Category
特性的编译参数,无奈之下只好求助 stackoverflow
,最终找到了根本原因和解决方法。