iOS 静态库、动态库制作及使用

转载自:http://blog.csdn.NET/vbirdbest/article/details/52869237

什么是库 ?

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

库的分类

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

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

静态库存在的形式

.a

.framework

动态库的存在形式

.dylib

.framework

静态库和动态库的区别

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

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

动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;

但是项目中如果使用了自己定义的动态库,苹果是不允许上架的,在iOS8.0以后苹果开放了动态加载.dylib的接口,用于挂载.dylib动态库

静态库的运用场景

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

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

静态库的特点

.a + .h

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

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

制作静态库.a

新建静态库New—>Project—>Cocoa Touch Static Library

写一个方法模拟一个功能

3. 指定静态库需要公开的头文件

4. 选择模拟器iphone6s, 然后 Command + B 编译静态库, 可以看到iFly.a文件名由红色变为黑色,右键 Show In Finder

5. 使用静态库,新建一个工程,然后将iFly.a 和 include头文件拖进项目中,然后使用iFly.h公开的方法,然后选择iphone6s 模拟器运行

制作静态库相关问题

我们在制作静态库是使用的模拟器iPhone6s, 如果对测试项目TestStaticLib使用iPhone6s运行完全没问题,但是如果选择模拟器为iphon5和Generic iOS Device进行编译(command + B)就会 报错:Undefined symbols for architecture i386(未定义的符号i386架构)

架构是神马东东?

CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。模拟器上的架构和真机上的架构是不一样的,模拟器和模拟器之间,真机和真机之间的架构也是不同的。如果静态库的架构和测试项目对应的模拟器或真机上的架构不对应就会报“未定义的符号XXX架构”, 由此可以得出模拟器上的静态库!

模拟器架构

iPhone4s ~ 5 : i386

iPhone5s ~ 7Plus : x86_64

真机架构

3GS~4s : armv7

5/5c : armv7s(armv7兼容armv7s)

5s ~ 6sPlus : arm64

使用iPhone6s打包的静态库架构是:x86_64, 测试项目选择的是模拟器iPhone5对应的架构是:i386, 架构不匹配所以报Undefined symbols for architecture i386

查看静态库对应的架构

在终端上使用命令: lipo -info Xxx.a

input file libiFly.a is not a fat file:输入文件libiFly.a不是一个胖文件,胖文件是指只支持一个架构,不兼容其它架构。

让静态库支持所有模拟器对应的架构

Build Settings—>Build Active Architecture Only(只构建活跃的架构)—-> NO

什么叫只构建活跃的架构?所谓活跃的架构是指当前选中的模拟器的架构,你选中的就称为活跃的,你没有选中的那些称为不活跃的,重新编译(Command + B)一下静态库,可以拖到测试项目中选中各种模拟器进行测试都是正常的。

重新编译之后查看静态库支持的架构,同时支持i386和x86_64,是一个胖文件

静态库的版本

静态库有4种版本:

调试版本:不会对代码进行优化

模拟器版本

真机版本

发布版本 :会对代码进行优化,执行效率相对调试版本快,但不会有明显的差别

模拟器版本

真机版本

选中模拟器编译默认是调试版-模拟器版本,选中GenericiOSDevice默认是是调试版本-真机版本

生成Release版本的静态库

首先编辑静态库对应的Scheme为Release,然后分别选择模拟器或真机Command + B 进行编译

合并静态库

我们知道模拟器版本的静态库和真机版的是不能通用的,那么怎样让一个静态库即支持模拟器又支持真机呢?

使用终端 lipo -create Xxx1.a Xxx2.a -output Xxx.a

合并后同时支持i386、armv7、x86_64、arm64 这四种架构,合并就是将两个.a文件相加,合并后文件的大小是两个文件之和。通常自己制作静态库给别人用一般是给两个发布版对应的模拟器和真机版本,不给合并版本,因为用户想合并可以自己进行合并,如果给用户一个合并版的,用户则无法分解的。

制作静态库.framework

创建静态库工程,默认是动态库,修改Build Settings—>Mach-O Type:Static Library

创建一个类,模拟静态库中的一个功能

公开头文件

将其他需要公开的头文件包含到总的头文件中

iFly.h 是一个总的头文件,可以将其他需要公开的文件都统一写到总的头文件中,用户在使用的时候就导入这一个总的头文件即可

修改Build Settings–>Build Active Architecture Only: NO, 将Scheme修改为Release 分别选择真机和模拟器进行编译 Command + B, 右键iFly.framework Show In Finder

查看Release版本的模拟器和真机支持的架构

创建一个项目进行测试,将Release-iphonesimulator下的iFly.framework拖进到工程中,并调用静态库中的方法

制作动态库.framework

制作动态库和上面步骤差不多,不同的是在编译framework时要指定Mach-O Type: Dynamic Type

将.framework文件添加到General—> Embedded Binaries 中,不添加会报错

.bundle

在使用第三方库时有可能会有一个.bundle文件,.bundle其实是一个物理文件夹,里面可以放图片等资源。因为.bundle是一个物理文件夹,所以当被拖入到项目中就不会和自己项目中的图片重名。

.a 和 .framework

使用.a时需要同时将.a 和 .h 文件拖入到工程中,使用.framework时直接将这个文件夹拖入进去即可,因为.framework文件夹中已经包含了.h文件。

.a + .h + .bundle = .framework, 使用.framework更加方便

静态库如何一边开发一边进行调试

创建一个复合项目

1. 创建一个普通工程Single View Application

2. 在TARGETS中添加一个静态库

-

-

3. 在普通Target中添加目标依赖 Target Dependencies,选中刚才的静态库

4. 在普通Target–> Link Binary With Libraries 中添加静态库

5. 在ViewController#viewDidLoad中测试

6. 至此静态库开发好,测试完成后修改静态库对应的Build Active Architecture Only:NO

7. 修改Scheme为Release

8. 暴漏头文件:Build Phases —> Copy Files

9. 分别对Release的真机和模拟器进行Command + B

Swift不支持静态库只支持动态库

Swiftis not supported for static libraries.

Swift暴漏方法的方式:Swift不像OC那样有头文件,将Swift中的类和方法用public修饰就可以将类和方法暴漏出来

public class Tool : NSObject {

public func tool(){

print(“Test”)

}

}

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

推荐阅读更多精彩内容