当前版本xcode11.0
两个sdk包含相同类,不会再报symbols冲突错误,编译能正常通过。
但是两个sdk这个包含相同类,在使用中会有一些问题。
1,工程验证
新建两个生成静态库.a工程testa和tasetb,其中testa中包含aa,bb,cc三个类,testb工程包含aa,dd,ee三个类。
![](https://img.haomeiwen.com/i1782551/ccb35804dd66f4c0.png)
![](https://img.haomeiwen.com/i1782551/037308ea92e7f88f.png)
其中testa中的aa类,增加两个对象方法
-(void)aaaa;
-(void)aaaa_x;
方法实现
-(void)aaaa{
NSLog(@"aaaa---1");
}
-(void)aaaa_x{
NSLog(@"aaaa_x");
}
testb工程中aa类,也添加两个对象方法
-(void)aaaa;
-(void)aaaa_y;
方法实现
-(void)aaaa{
NSLog(@"aaaa----2");
}
-(void)aaaa_y{
NSLog(@"aaaa_y");
}
testa,testb都添加一个接口printAll
-(void)printAll{
aa*a = [[aaalloc]init];
[aaaaa];
[aaaaa_x];
bb*b = [[bballoc]init];
[b bbbb];
cc*c = [[ccalloc]init];
[ccccc];
}
-(void)printAll{
aa*a = [[aaalloc]init];
[aaaaa];
[aaaaa_y];
dd*d = [[ddalloc]init];
[d dddd];
ee*e = [[eealloc]init];
[eeeee];
}
然后将testa,testb工程编译,生成对应的.a,再都集成到一个工程中。
![](https://img.haomeiwen.com/i1782551/94a563e0ba98d823.png)
并在appdelegate中引用并调用
![](https://img.haomeiwen.com/i1782551/b29ae3bac36f84b2.png)
运行之后你会发现,报错了。
-[aa aaaa_x]: unrecognized selector sent to instance 0x600003578160
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[aa aaaa_x]: unrecognized selector sent to instance 0x600003578160'
去掉两个工程aa类中aaaa_x和aaaa_y,或者在testa和testb不调用。再次运行起来,打印出来了,但是打印不全。
testConflict[93362:5429712] aaaa----2
testConflict[93362:5429712] bbbb
testConflict[93362:5429712] cccc
testConflict[93362:5429712] aaaa----2
testConflict[93362:5429712] dddd
testConflict[93362:5429712] eeee
打印出来的是testb中的aa类的aaaa对象方法,testa中的aa类aaaa方法没有打印。
不再多做啰嗦,直接上结果,类方法同样结果。
1,由于dylb加载,在build phases的Link Binary With Libraries中,那个SDK的.a或者framework在前,那个sdk的同名类被注册。
2,同时该类中方法也会被注册却定下来,如果两个同命类拥有一样的方法没有问题,但如果不同,该方法有必定会被调用,就必定有上面的冲突报错。
现在公司制作的产品很多是b2b的,产品很多时候会以sdk(.a/framework)的方式呈现。在研制自己产品的sdk时,除了添加系统支持的依赖库外,可能会用到外来的库文件,比如OpenSSL,OpenGL之类的,这些公开的库如果跟上述一样,不做更改使用一样版本,那么两个sdk集成在一个工程中不会有任何影响,但是如果如果有一方sdk修改其中的文件方法(添加新方法/修改就方法),那结果自然就出现问题。
建议:
我们自己制作的sdk的普适性会被降低,所以引用外面库最好使用标准版本,尽量不在原类上做修改。
添加自己的类文件,名称最好不要那么大众,普通的语义英文翻译后最好加一个前缀多做区分。
工作中遇到的...记录分享~
网友评论