当前版本xcode11.0

两个sdk包含相同类,不会再报symbols冲突错误,编译能正常通过。

但是两个sdk这个包含相同类,在使用中会有一些问题。

1,工程验证

新建两个生成静态库.a工程testa和tasetb,其中testa中包含aa,bb,cc三个类,testb工程包含aa,dd,ee三个类。

其中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,再都集成到一个工程中。

并在appdelegate中引用并调用

运行之后你会发现,报错了。

-[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的普适性会被降低,所以引用外面库最好使用标准版本,尽量不在原类上做修改。

添加自己的类文件,名称最好不要那么大众,普通的语义英文翻译后最好加一个前缀多做区分。

工作中遇到的...记录分享~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐