XCODE9 跳过的那些坑儿

最近升级了Xcode,升级第一天就遇到了坑,听我一一道来

一:应用中拖入第三方类报错

Undefined symbols for architecture arm64: “_OBJC_CLASS_$_xxxxxx”, referenced from: objc-class-ref in xxxxxxx.o 

XCODE9 跳过的那些坑儿

记得以前曾经遇到过这样的问题,但是忘了怎么处理了,于是一顿谷歌百度,先按照前辈们的指点做一下两步检查
(1)查看Build Settings -------->Valid Architectures 中所支持的架构是否有arm64,如果没有加入
XCODE9 跳过的那些坑儿
(2)查看Build Settings -------->Other Linker Flags 中是否有键$(inherited),如果没有添加$(inherited)
XCODE9 跳过的那些坑儿

按照前辈们的经验,检查修改完毕,抱着很大的希望运行项目,结果.......还是报这个错。于是心不甘一顿摸索,终于找到了问题的解决办法。如下
问题的根源是由拖入第三方类库导致的,于是检查Build Phases -------->Compile Sources
查看我们新拖入项目的类的.m文件是否被加入Compile Sources,一看果然没有被加载进来,于是找到第三方类库的.m文件,手动添加进来。如下图:
XCODE9 跳过的那些坑儿

重新运行项目,项目终于可以正常运行。

二:项目中拖入第三方类库(含有xib文件),在调用第三方类库(控件),如果控件是从xib中加载的报错:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/containers/Bundle/Application/0FEBBEE9-08EC-4BBB-8A7F-0E0EBF38F346/FeOAClient.app> (loaded)' with name 'xxxxxxx'';

XCODE9 跳过的那些坑儿

这个问题之前也遇到过,一般都是调用[[[NSBundle mainBundle] loadNibNamed:@"xxxxx" owner:self options:nil] firstObject],方法时,把nibName写错了,但是这次检查了xib文件名并没有写错,那就奇怪了,于是追求溯源,既然报错说无法从资源包中加载这个nib,那就去看看新拖入的第三方xib是否被加进了资源包,Build Phases -------->Copy Bundle Resouces,进去一看果不其然,新拖进项目的xib是没有被自动加载进来的,于是只好手动添加:
XCODE9 跳过的那些坑儿

添加进去之后,项目正常运行,第三方类库也可以正常使用。

总结:从以上两个问题可以看出,在Xcode9中编译器不会把新拖入项目的类自动加载到目标中的编译源代码(Compile Sources)中,也不会把xib、图片等资源添加到资源包(Build Phases -------->Copy Bundle Resouces),都需要我们手动添加。