制作动态framework与静态framework的那些坑(二)

2020-05-07 09:51:27 浏览数 (1)

上篇文章我们综合讲解了做了Dynamic Library的framework 和 Static Library 的framework这两种库的流程和注意事项。

两种framework的制作

今天我们再来说一个非常重要不可忽视的坑

静态库内部类添加Category

啥?Category?你可能会说这个再常见不过了,多么常用的功能啊,但是这个坑第一是必须要踩,并且莫名其妙………

我们接着上次的工程为EmViewController.h添加Category

代码语言:txt复制
#import <EmbededFramework/EmbededFramework.h>
NS_ASSUME_NONNULL_BEGIN
@interface EmViewController (EmCategory)-(void)emStaticLibCategoryTest;@end
NS_ASSUME_NONNULL_END

#import "EmViewController EmCategory.h"
@implementation EmViewController (EmCategory)-(void)emStaticLibCategoryTest{    NSLog(@"%s == %s",__FILE__,__func__);}@end

就是这么简单,我们下载重新Build之后在壳工程中试着调用吧

代码语言:txt复制
 EmViewController *vc =   [[EmViewController alloc] initWithNibName:@"EmbededFramework.framework/EmViewController" bundle:[NSBundle mainBundle]];
    [vc emStaticLibCategoryTest];

不出意外的话恭喜您,crash驾到

`EmbededFrameworkTest99929:9240476 * Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-EmViewController emStaticLibCategoryTest: unrecognized selector sent to instance 0x7f9fae5100f0’

惊喜不?意外不?

我们先来做处理让他能顺利通过,然后在说原因

解决办法

被导入库的工程中选中Target=》Build Setting =>搜索othe linker flags

添加 -ObjC

理论答疑(网上教程)——Other Linker Flags

  1. -ObjC:这个flag告诉链接器把库中定义的OC类和Category或nib都加载进来,编译后app会变大,以为加载了很多不必要的文件导致可执行文件变大。但是如果静态库中有类和分类只有加入这个flag才行;但是当静态库中只有分类而没有类时,-ObjC就失效了,这时需要加-all_load 或 -force_load了
  2. -all_load:会强制链接器把目标文件都加载进来,即使没有objc代码。 弊端:当使用了不只一个静态库文件,会遇到ld:duplicate symbol错误,因为不同库里会有相同的目标文件,针对这个问题有两种解决方法:1》用命令行就行拆包2》用另一个参数-force_load
  3. -force_load: 这个flag与-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库的文件路径,这样只是完全加载了一个库文件,不影响其余文件按需加载

0 人点赞