IOS 创建静态库(.a, .framework) 动态库(.framework, .dylib)

首先,需要知道什么是库?为什么建库?动态库和静态库的区别是什么以及各自的特点?

1. 什么是库啊?

库就是程序代码的集合, 将N个文件组织起来, 是共享程序代码的一种方式

2. 库的分类?

开源库: 源码是公开的, 可以看到每个实现文件 .m 的实现, 例如 Github 上常用的开源库 AFNetworking, SDWebImage 等.

闭源库: 不公开源码, 是经过编译后的二进制文件, 看不到具体的实现. 闭源库又分为: 静态库 和 动态库

3. 静态库的存在形式?

.a .framework

4. 动态库的存在形式?

.dylib .framework

5. 静态库和动态库的区别?

.a 文件肯定是静态库, .dylib 肯定是动态库, .framework 可能是静态库也可能是动态库

静态库在链接时, 会被完整的赋值到可执行文件中, 如果多个APP都使用了同一个静态库, 那么每个APP都会拷贝一份, 缺点是浪费内存, 类似于定义一个基本变量, 使用该基本变量是新复制了一份数据, 而不是原来定义的

动态库不会复制,只有一份, 程序运行时动态加载到内存中, 系统只会加载一次, 多个程序公用一份, 节约了内存. 类似于使用变量的内存地址一样. 使用的是同一个变量,但是项目中如果使用了自己定义的动态库, 苹果是不允许上架的, 在 iOS8 后 苹果开放了动态加载 .dylib 的接口, 用于挂载 .dylib 动态库

6. 静态库的运用场景?

保护自己的核心代码, 如讯飞语音摸索了好多年探索出的结果当然要保存起来, 都公开了公司怎么生存

将MRC的项目打包成静态库, 可以在ARC下直接使用, 不用转换, 如别人使用 MRC 写的开源库, 放到自己的ARC项目中, 需要对每个文件加一个编译参数 -fno-objc-arc 这样相对来说很麻烦, 将整个工程打包成静态库直接放到项目中即可, 也不用对每个文件添加编译选项

7. 静态库的特点?

.a + .h

.a : 可以看做所有 .m 文件加密后的一个二进制文件

.h : 头文件, 用户暴露可用的接口 (方法)

8. 构架是什么?

CPU 构架 是 CPU 厂商给属于同一系列的 CPU 产品定的一个规范, 主要目的是为了区分不同类型 CPU 的重要指示, 模拟器上的构架和真机上的构架不是一样的, 模拟器和模拟器之间, 真机和真机之间的构架也是不同的, 如果静态库的构架和测试项目对应的模拟器或者真机上的构架不对应就会报错 "Undefined symbols for architecture arm64/i386"

查看静态库对应的构架: lipo -info Xxx.a 

静态库都支持哪些构架?
模拟器架构
    iPhone4s ~ 5 : i386
    iPhone5s ~ 7Plus : x86_64
真机架构
    3GS~4s : armv7
    5/5c : armv7s(armv7兼容armv7s)
    5s ~ 6sPlus : arm64

静态库.a的创建过程

1. 新建一个静态库工程(Cocoa Touch Static Library)

创建静态库

2. 工程内会自动生成与工程同名的文件,我在.h文件中定义一个类方法,便于一会测试,在.m中实现类方法打印 “Static Library”。

定义一个类方法

3. 修改下面:如果是YES,说明当前活跃的版本是8,如果只编译此机型,就设置成YES,适配所有的架构Architecture 设置为No。

修改activeArchectureOnly

4. 通过选择模拟器以及Generic ios Device分别Command + B编译后,可以通过Products文件夹中.a的静态库文件show finder找下如下的文件路径。Debug-iphoneos/Debug-iphonesimulator分别代表Debug模式下真机和模拟器的静态库文件。如果在不同的模式下导入错误的静态库会报错的。

生成debug版.a文件

5. 上面事Debug模式下的两种形式,还有release模式的两种形式。可以通过Product -> Scheme -> EditScheme 修改下面的方式更改build模式。

修改release模式

6. 通过修改EditScheme又生成了release模式下的两种静态库形式。

生成release版.a文件

7. 为了方便集成,可以将统一模式下的真机库和模拟器库合并成一个通用的静态库。

lipo -create /所在路径/Release-iphoneos/xxx.a /所在路径/Release-iphonesimulator/xxx.a  -output 目标路径/xxx.a
这样,就可以合并成一个通用的静态库,唯一的缺点是体积要大一点相对于真机和模拟器两个的总大小 之后将这个静态库拖到工程中即可
合并生成通用的.a文件

8. 将生成的通用静态库替换原静态库,并且将静态库和include文件夹一同拖入项目中。

将通用的.a文件和include文件夹拖到项目中

9. 拖入到项目中需要勾选的选项。

拖到项目中

10. 引入头文件 + 调用 + 打印

引入头文件使用

以上就是静态库.a的创建以及使用过程。下面就来创建.framework库。

1.新建.framework库工程

新建.framework库

2.通过此处修改.framework是动态库还是静态库

修改.framework是动态还是静态

3. 新建文件,添加测试代码

创建文件

4. 将需要暴露的头文件导入.h文件

导入头文件

5. 设置header,将需要暴露的头文件放在public下面,隐藏在project或者private下面无法被引用。

暴露头文件

6. 同上述创建.a库操作一样,通过选择模拟器以及Generic ios Device分别Command + B编译后,可以通过Products文件夹中.framework的静态库文件show finder找下如下的文件路径。通过终端指令将Debug-iphoneos和Debug-iphonesimulator下的xxx.framework/xxx合并成通用framework。然后将通用的framework替换原framework。最后将替换完成的xxx.framework拖入到项目中。

生成.framework库

7. 引入头文件 + 调用 + 打印

.framework库的使用

以上就是.a / .framework库的创建到使用过程。如果有任何不正确的地方还请指点!!!

参考: iOS 静态库(.a, .framework) 动态库(.framework, dylib)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容