iOS Static Library和Framework的共同点和区别

参考文章:- http://my.oschina.net/leejan97/blog/284193
- https://blog.csdn.net/jingcheng345413/article/details/54969324
- http://08643.cn/p/a04310199d7b
- http://www.cocoachina.com/articles/23082

一、共同点:

两者其实都是静态库。

二、区别

1.承载的内容范畴:

(1)Static Library的产出物只是一个.a文件,为二进制执行文件。分享给别人的时候,头文件、静态资源文件需要另外提供。

(2)Framework为一站式分享方案,其实是一个文件夹,其中包含代码签名、头文件、二进制执行文件、静态资源文件等。

2.头文件搜索路径的区别:StaticLibrary需要设置头文件搜索路径,Framework不需要。

3.当存在对外部代码库依赖的时候

(1)StaticLibrary:能够只引用外部库的头文件,调用外部库的公开方法,而不引入其库实现,实现与引用库的分离部署。

(2)Framework:要引用一个外部库,就必须要将此外部库的实现放入Framework内编译才可以。如果要想达到StaticLibrary的效果,可以使用运行时方式调用。

4.运行环境(对3的理解升级)

(1)StaticLibrary:共享其运行环境,假如其运行环境中包换库中同一个类,会发生代码冲突,必须剥离其中一方的此类,然后共享此类。

(2)Framework:与其运行环境隔离,假如其运行环境中包换库中同一个类,不会发生冲突,同名的两个类会在各自的环境中独立运行,互不干扰,哪怕是单例类。

综合,如何选择使用Framework还是StaticLibrary

(1)假如不想在同一个App中包含多份三方库(减小包大小),可以使用StaticLibrary,库本身和App共享第三方库。但是产出物的结构可能会比较乱。

(2)假如不想考虑和App的代码冲突问题,库本身独立使用需要的库,想提供比较好的库结构,可以使用Framework。但是假如库本身和App都使用了同一个三方库,会存在两份三方库,会增加包大小。

三、创建Static Library

1、创建Static Library,点击File--> New --> Target(如图)


屏幕快照 2020-10-06 下午6.07.42.png

2.创建了静态库Static Library之后,Xcode自动为我们创建了XXX.h/.m文件
3.编译项目,生成对应的静态库.a文件,编译的时候,记得选上项目(当然你的是什么名字的,就选对应的就好),然后用模拟器环境和真机环境都编译一下,红色的libXXXX.a文件就变成黑色了


屏幕快照 2020-10-06 下午6.31.39.png

4、合并静态库
针对真机和模拟器的静态库文件只能在一个平台下面使用,好在我们可以将真机和模拟器上面的静态库文件合并成一个在真机和模拟器都可以使用的静态库文件,通过在终端输入命令即可完成该目的,
完整的命令:

lipo -create /Users/doudou/Library/Developer/Xcode/vedData/JJPickView-eqviycrqcwweiretrodyzdijhulx/Build/Products/Debug-iphoneos/libXXX.a /Users/doudou/Library/Developer/Xcode/DerivedData/JJPickView-eqviycrqcwweiretrodyzdijhulx/Build/Products/Debug-iphonesimulator/libXXX.a -output /Users/doudou/Desktop/libXXX.a

这个是自己的文件路径,改成自己相应的路径

5、使用静态库文件

这时候我们就可以使用自己创建、编译生成的静态库文件了,将相关xxx.h文件和桌面上面的libXXX.a文件拖到想要使用的项目中

四、创建framework

  1. 打开Xcode,新建工程。
    选择 create framework & library
    选择 framework

  2. 创建我们所需要的文件类,比如继承与NSobject 的testH 类

  3. 更改参数
    接下来对我们的这个.framework静态库进行一些简单的设置。

(1)首先是Dead Code Stripping设置为NO,网上对此项的解释如下,大致意思是如果开启此项就会对代码中的”dead”、”unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可。

(2)然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接

(3)最后将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。
(4)还要记得把要公开的类添加到我们的FrameWorkTest.h中

  1. 打包 Framework
使用 lipo 命令
  1. 首先要支持多个架构,设置路径 Build Settings -> Build Active -> NO 支持多个架构的静态库。然后选择模拟器和Build Only Device,分别编译一次。
    2.通过终端命令将两个framework合为一个模拟器和真机都可使用的framework。
lipo -create  /Users/chenjiazhen/Library/Developer/Xcode/DerivedData/CharTest-dxlrsuvcbsfyohedbbfitrvbqygx/Build/Products/Debug-iphoneos/CharTest.framework/CharTest /Users/chenjiazhen/Library/Developer/Xcode/DerivedData/CharTest-dxlrsuvcbsfyohedbbfitrvbqygx/Build/Products/Debug-iphonesimulator/CharTest.framework/CharTest -output /Users/chenjiazhen/Desktop/CharTest

然后 会生成一个.lipo文件
此时 修改后缀.framework 即可生成我们需要的framework包

最后需要总结的:

1、在制作framework或者lib的时候,如果使用了category,则使用改FMWK的程序运行时会crash,此时需要在该工程中 other linker flags添加两个参数 -ObjC -all_load。(这点没有亲测)

2、带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中。

3、公开的类中如果引用的private的类,打包以后对外会报错,找不到那个private的类,可以把那个private的.h放到(也没亲测)

4、namespace 冲突。静态库用了某第三方库,项目也用了同样的第三方库,在编译的时候就会有 duplicate symbol 错误,因为有两份同样的第三方库。解决办法就是把用到的第三方库加上自定义前缀,包括类名、delegate 协议、常量名,尤其需要注意 Category 的方法名要修改。

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