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