此文是编译原理的验证,具体原理后续再写。
发生报错的情况是:同一个类中同时引用了重复类。
第一种情况
项目中不止一次引入相同的类:

编译会报错:

解决方案:
移除多余的类。
第二种情况
引入了第三方静态库SDK
,第三方SDK中的类名与自己项目中类名重复。
前提:
假设重复的类名为:FHStaticObj
。
假设 ViewController
引入该重复类。
情景1
假设重复类的声明(.h 方法名)都一致。
1.同一个类中先引入项目中的FHStaticObj
,再引入三方SDK中的<static/FHStaticObj.h>
引入顺序为:
#import "FHStaticObj.h"
#import <static/FHStaticObj.h>
不会报错,执行项目中FHStaticObj
的实现。
2.同一个类中先引入三方SDK中的<static/FHStaticObj.h>
,再引入项目中的FHStaticObj
引入顺序为:
#import <static/FHStaticObj.h>
#import "FHStaticObj.h"
会报错Duplicate interface definition for class 'FHStaticObj'
,此时有三种处理方案:
- 1.(不删除项目中的
FHStaticObj
)只引入SDK中的类import <static/FHStaticObj.h>
:
执行项目中FHStaticObj
的实现。 - 2.(不删除项目中的
FHStaticObj
)只引用项目中的类#import "FHStaticObj.h"
:
执行项目中FHStaticObj
的实现。 - 3.(删除项目中的
FHStaticObj
),引入SDK中的类import <static/FHStaticObj.h>
:
执行三方SDK中<static/FHStaticObj.h>
的实现。
情景2
假设重复类的声明(.h 方法名)不一致。
1.同一个类中先引入项目中的FHStaticObj
,再引入三方SDK中的<static/FHStaticObj.h>
#import "FHStaticObj.h"
#import <static/FHStaticObj.h>
会报错:'FHStaticObj' has different definitions in different modules; first difference is defined here found method
2.同一个类中先引入三方SDK中的<static/FHStaticObj.h>
,再引入项目中的FHStaticObj
#import <static/FHStaticObj.h>
#import "FHStaticObj.h"
会报错:Duplicate interface definition for class 'FHStaticObj'
3.只引入项目中的FHStaticObj
不会报错,且会执行项目中FHStaticObj
的实现。
如果把项目中FHStaticObj
删除,会报错。
4.只引入三方SDK中的<static/FHStaticObj.h>
不会报错,且会执行项目中FHStaticObj
的实现。
如果把项目中FHStaticObj
删除,也不会报错。
第三种情况
引入了两个第三方SDK静态库:staticA.framework
,staticB.framework
。且两个SDK中包含相同的类FHStaticObj
1.同一个类中引入staticA.framework
,staticB.framework
#import <staticA/FHStaticObj.h>
#import <staticB/FHStaticObj.h>
或
#import <staticB/FHStaticObj.h>
#import <staticA/FHStaticObj.h>
此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build Phases
中Link Binary With Libraries
中SDK加载顺序有关。

第四种情况
引入了两个第三方SDK:静态库:staticA.framework
,动态库:dynamic.framework
。且两个SDK中包含相同的类FHStaticObj
。
此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build Phases
中Link Binary With Libraries
中SDK加载顺序有关。

第五种情况
引入了两个第三方SDK动态库:dynamicA.framework
,dynamicB.framework
。且两个SDK中包含相同的类FHStaticObj
。
此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build Phases
中Link Binary With Libraries
中SDK加载顺序有关。
且控制台都会有警告。
第六种情况
引入了两个第三方SDK静态库:staticA.a
, staticB.framework
。且两个SDK中包含相同的类FHStaticObj
。
如果同时都引入两个SDK的头文件,会报错。处理方案:只引用一个头文件,此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build Phases
中Link Binary With Libraries
中SDK加载顺序有关。最彻底的解决方案是移除一个SDK中的FHStaticObj
。
控制台没有警告。
第七种情况
引入了两个第三方SDK:静态库:staticA.a
, 动态库:dynamicB.framework
。且两个SDK中包含相同的类FHStaticObj
。
如果同时都引入两个SDK的头文件,会报错。处理方案:只引用一个头文件,此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build Phases
中Link Binary With Libraries
中SDK加载顺序有关。最彻底的解决方案是移除一个SDK中的FHStaticObj
。
动态库在下时,控制台有警告。
网友评论