这2天有个小伙子问到在工作区xcworkspace,引入2个工程,一个是自己的项目,一个是AsyncDisplayKit,编译通过了,但是一运行就提示AsyncDisplayKit中的方法不存在,百思不得其解,他将代码发给我。
我检查了一番,确实是按照AsyncDisplayKit中所提示的来的,Other linker flags也设置了,跑起来也确实出现 unrecognized selector sent to instance 0x7fa50484a200
直观的看起来,就是提示AsyncDisplayKit的方法找不到,但是在Build Phases中已经添加了libAsyncDisplayKit.a。静下心来仔细思考一下,我就再次去检查了下 Other linker flags的设置,果不其然,他写了 -lc++与-objC 。哎发现问题之后总是感觉如此简单, 我淡定的将
-objC 修改为 -ObjC, 保存运行。 一切OK。
到这里,问题已经解决,哪么也许有人会问这2者有啥区别。
第一,OC语言是严格区分大小写的。
第二,源代码到可执行文件的过程比较复杂, 源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件。哪么-ObjC的作用就是 链接器 > 可执行文件这步的催化剂,加了这个-ObjC后,链接器就会把静态库中所有的Objective-C类和分类都加载到可执行文件中,但是这里我们大小写错了,因此最后缺少了这步,也就是说我们的执行文件当然也就找不到对应的class与method了。
以上为个人理解,如有不正确,请指出,谢谢。