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