这个错误在开发中,还算是比较常见的.
个人只遇到两种情况导致这个问题的出现
1.引入头文件时粗心大意
在Xcode中, 引入头文件的智能提示,提供文件的.h 和 .m两种提示, 有的时候一不小心, 引入一个.m 那么就会导致这个错误的出现
2.缺少某个类的@implementation, 也就是实现
这个情况在一般情况下应该不会出现, 因为在创建一个新文件的时候, .h , .m两个文件中会自动生成@interface 和 @implementation, 所以不会导致这个错误.
但是很多时候, 我们会在一个类里面写及各类, 这个时候@interface 和@implementation就需要我们手动去写了. 如果只写了Class A的@interface 没有写 Class B的@implementation, 并且在其他类中用到了Class A的对象或方法, 那么也会导致这个错误.
以上是本人在开发中遇到的关于"_OBJC_CLASS_$_类名", referenced from: objc-class-ref in 另一个类名.o
的错误.
下面是自己在网上收集的一些关于这个错误的出现情景和解决方式
[参考:彻底解决OBJC_CLASS$_某文件名", referenced from:问题(转)]
1. 引入静态库
静态库分为模拟器用的和真机用的, 真机用的又需要支持所有的CPU架构, 所以在引入静态库的时候, 引入当前设备不支持的库时,也会导致这个错误的出现
排错方法: 如果当前选中设备是模拟器, 那就换成真机再编译一下(尽量别选用5和5c).如果错误消失, 那就是引错了静态库
也可以使用lipo -info在终端中查看framework的支持架构
2.报错文件没有参加编译
可能是在往项目中拖拽文件的时候没有Add totargets,或者add错了
可以到在Build Phases里的Compile Sources 中看看有没有ClassA.m,如果没有,手动添加一下该类的.m文件
3. 重复编译,可能你之前复制过两个地方,在这里添加过两次,删除时系统没有默认删除编译引用地址
在Build Settings里搜索Search Paths 将里面Library Search Paths 中没有用到的地址删除