专栏首页大话swift制作动态framework与静态framework的那些坑(二)

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

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

两种framework的制作

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

静态库内部类添加Category

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

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

#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之后在壳工程中试着调用吧

 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需要指定要进行全部加载的库的文件路径,这样只是完全加载了一个库文件,不影响其余文件按需加载

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:YuLongLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 房贷选择之策略模式

    之前我们说了房贷计算,资讯了icbc,给出了你大致的每月房贷明细,也给出了你N中贷款方式,那么今天我们就扯一下贷款选哪种方式吧。 1 商贷 2公积金 3组合贷款...

    大话swift
  • swift简易操作sqlite3

    sqlite轻便小巧,底层采用C操作,跨平台在Linux和Android以及iOS甚至是嵌入式都通用,今天我们简易进行一些swift操作sqlite……

    大话swift
  • promise版本的golang

    之前我们分析了swift版本的PromiseKit,最近也在琢磨能否移植到咱大golang上来,找了好久也没有相对应的粒子。于是经过一次失败的尝试之后这周末花了...

    大话swift
  • ubuntu搭建Apache+PHP+MySQL

    AlicFeng
  • Java岗“面霸”复工期间,急面 20+互联网公司(阿里头条滴滴等)

    先说下自己的情况,17年在京东实习,19年7月离职。正式工作时间很短,就一年(算实习两年),而且19年有半年的时间准备考研所以有半年的空档期,这也是为什么我被很...

    秃顶的Java程序员
  • Leetcode: Subsets

    题目: Given a set of distinct integers, S, return all possible subsets.

    卡尔曼和玻尔兹曼谁曼
  • DevOps平台之开源技术图谱

    DevOps平台在研发过程中,集成了许多的第三方工具来完善持续集成的流程,诸如Jira、Gitlab、Jenkins等,集成一个工具其实是一个繁琐的工作,需要注...

    yuanyi928
  • SaaS模式与技术架构

    SaaS是Software as a Service(软件即服务)的缩写,它是云计算的主要体现形式之一,其他的还有诸如平台即服务(PaaS),基础设施即服务(I...

    物流IT圈
  • 专属| GitHub发布Python安全警告

    近日,GitHub宣布了Python安全警告,使Python用户可以访问依赖图,并在他们的库所依赖的包存在安全漏洞时收到警告。GitHub会根据MITRE的公共...

    漏斗社区
  • Debian 使用 iptables-persistent 持久化 iptables 规则

    RedHat系列下有比较好用的iptables管理工具,可以像控制服务进程一样来对防火墙进行管理及控制,Debian系发行版默认不开启iptables,当然也没...

    Debian社区

扫码关注云+社区

领取腾讯云代金券