轻松玩转自定义ios库

1.库的介绍。

  • 什么是库?
    • 库是程序代码的集合,是共享程序代码的一种方式
  • 根据源代码的公开情况,库可以分为2种类型
    • 开源库
      • 公开源代码,能看到具体实现
      • 比如SDWebImage、AFNetworking
    • 闭源库
      • 不公开源代码,是经过编译后的二进制文件,看不到具体实现
      • 主要分为:静态库、动态库
  • 静态库和动态库
    • 静态库和动态库的存在形式
      • 静态库:.a 和 .framework
      • 动态库:.dylib 和 .framework
    • 静态库和动态库在使用上的区别
      • 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
      • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
      • 需要注意的是: 项目中如果使用了自制的动态库,不能被上传到AppStore
  • 应用场景
    • 静态库应用场景(一)
      • 百度地图想开发者在应用程序中集成百度地图
      • 但是百度不想公布自己的技术实现,如何完成呢?
      • 百度将自己的核心代码编译成静态库
      • 对外暴露统一的接口
      • 开发者集成静态库,并且调用静态库即可集成
    • 静态库应用场景(二)
      • 公司项目开发有一部分代码为核心代码
      • 如果任何人都可以拿到核心代码,那么一旦有人离职,公司核心代码就会一起被拿到.如何防止这种情况呢?
      • 公司抽出一部分核心团队成员,专门开发这部分核心代码
      • 开发后,将核心代码编译成静态库给其他程序员调用
      • 核心成员很少会离职,非核心成员离职无法带走核心代码

2.制作库:

下面有请我们的攻城利器闪亮登场!!!


Snip20161120_13.png

你没有看错在开发ios库时,Xcode为我们提供了两个开发工具,左边工具是生成后缀为.Framework的库的,默认生成的是动态库,开发语言是可选的(Swift或者OC),;右边工具只能生成后缀为.a的静态库,开发语言不可选(只能是OC)
说了辣么多,到底我们该选哪个呢?
其实上文我已经给出答案:"项目中如果使用了自制的动态库,不能被上传到AppStore",所以实际开发中我们常用的是右边的工具(Cocoa Touch Static Library)来自定义静态库,当然了这也并不绝对下文我会告诉你如何使用Cocoa Touch Framework 制作静态库顺利上传AppStore。

2.1如何自定义.a静态库

  • 创建项目时,选择Framework&Library-->Static Library
Paste_Image.png
  • 编写核心代码(例子如下)
Paste_Image.png
  • 编译静态库前,将头文件暴露出去
Paste_Image.png
  • 选择模拟器/真机分别编译(原因如下)
    知识点补充:
  • 设备的CPU架构
    • 不同的设备使用的CPU是不同的
    • CPU的不同造成使用的CPU架构(指令集)不同
  • 静态库有其支持的CPU架构
    • 如果静态库在不支持的CPU架构上运行就会报错
  • 模拟器使用的CPU架构
    • iPhone4s-iPhone5 : i386
    • iPhone5s-iPhone6plus : x86_64
  • 真机使用的CPU架构
    • iPhone3gs-iPhone4s : armv7
    • iPhone5-iPhone5c : armv7s
    • iPhone5s-iPhone6plus : arm64
    • 唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行
  • 综上:
    暂且不考虑真机和模拟器共存,仅仅当我们决定好在某一环境下使用时,最好在这个环境下编译一次处处运行吧!操作如下:
Paste_Image.png

注意:
观察编译前后:


Paste_Image.png
Paste_Image.png

让我们进入里面一探究竟!

Paste_Image.png
Paste_Image.png

从里面内容我们也可以发现我们编译是在调试(Debug)模式下,并且是区分设备的,此时显示时的是Phone模拟器 => 验证了我们之前的说法,编译创建的库是分设备(架构)的。

之前我们考虑好了各个环境下都应该是一次编译处处运行,是时候该考虑模拟器和真机通用的时候了,模仿模拟器的编译过程我们当然首先也要编译生成一个真机架构下的库

Paste_Image.png

再次进入库


Paste_Image.png

两个库!!不可能一次拖两个库吧!!让我们来合并一下他们好了。
终端命令补充:

  • 查看静态库支持的架构
    • lipo -info 静态库
  • 合并静态库
    • lipo -create 静态库1 静态库2 -output 合并的静态库

为了验证我们合并是否成功,我们先分别查看他们所支持的架构:
先看真机的:

Paste_Image.png

再看模拟器:

Paste_Image.png

接下来进入最激动人心的时刻:合并

Paste_Image.png

合并成不成功,验证一下就可以了

Paste_Image.png

恭喜你,还差最后一步😓
生成了一个指定的合并库,总不能就直接拖它进入你的项目吧(库是看不到源码的,你知道怎么使用??这下你该知道头文件暴露的好处了吧,暴露了你就应该把它和你新生成的库存放在同一个文件夹下呀!!!)具体操作如下

Paste_Image.png

最后试试你的库到底好不好使(测试下自己会不会用😝)


Paste_Image.png

2.2如何自定义.Framewor静态库
声明:默认情况下利用Cocoa Touch Framework 制作的库为动态库,动态库虽然能在模拟器下正常使用,但是不能上传AppStore,故我在这里不做深入介绍。其制作过程几乎与制作.a静态库一样。

一.编译.framework静态库

  • 创建项目时,选择Framework&Library-->Frameword
Paste_Image.png
  • 默认创建的项目中有一个主头文件,可以将其他头文件在该头文件中import一下
Paste_Image.png
  • 编写核心代码
  • 编译库前,将头文件都暴露出去
Paste_Image.png
  • 分别设置好模拟器和真机环境下都适配
Paste_Image.png
  • 将库设置为编译生成静态库!!!
Paste_Image.png
  • 再进入库内部文件,去合并两个库,具体操作和生成静态库一致,这里就不在赘述。

3实际开发中如何自定义库
1.直接新建一个库,写代码 -> 编译 -> 合并 -> 好了??文件一多,你能确保百分百正确?故这种方式不可取!!
2.将两个程序,一个测试,一个写库。。。可以,只要你不嫌麻烦!!
3主流:边开发边调试静态库
操作如下:

Paste_Image.png

接下来操作与常规开发一致,当确保库无误之后,切换编译Target,转为库,再分别编译 => 合并

注意:
1.如果制作的是动态库的话,一定要embeded binaries中将库导入一下,
2.如果编译的静态库中有分类的话必须在 Build Settings --> Other Linker Flags 中加 -Objc 如果还崩溃,还得加上 -all_load

3.关于在静态库中添加资源,一般使用的是bundle文件夹,如何创建呢?很简单先创建一个文件夹,然后将所需资源扔进去,最后将文件夹名称加上后缀bundle就ok了。***注意,默认的静态库编辑是不会将bundle一起编译进去的,所以这个文件夹需要我们手动添加到使用静态库的工程中去。
4.如果在swift中使用OC动态库,可不用建立桥接文件
5.用swift建立动态库:记得类和方法需要public 或open 具体看需求

4.关于库的那些坑!
1添加自定义动态库位置得手动添加!!!


Paste_Image.png

修改如下:

Paste_Image.png

2.合并库后的取名注意不要随便取,尽量与原库名一致,否则一致报错

Paste_Image.png

(对了,如果你想提升用户体验,那么你真正用到项目中的编译好的静态库其实只要支持真机的架构就行,那样app的占用空间会相对很小)

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

推荐阅读更多精彩内容