重点 (三十) : 静态库

简介

什么是库?

库是程序代码的集合,是共享程序代码的一种方式

根据源代码的公开情况,库可以分为2种类型

开源库

公开源代码,能看到具体实现

比如SDWebImage、AFNetworking

闭源库

不公开源代码,是经过编译后的二进制文件,看不到具体实现

主要分为:静态库、动态库

1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

.a的制作

如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并

在终端输入指令

lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

蓝色部分是固定指令

红色、紫色是真机和模拟器.a文件的路径

绿色是所合成.a文件的路径

.a文件的体积(一般情况下)

真机用的.a > 模拟器用的.a

所合成.a == 真机用的.a

  • 模拟器用的.a

通过lipo –info libMJRefresh.a可以查看 .a 的类型(模拟器还是真机)

9.png

模板制作.framework
• 手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单
• 模板地址
https://github.com/kstenerud/iOS-Universal-Framework
• 安装模板
• 在终端下进入iOS-Universal-Framework/Fake Framework文件夹
• 执行指令./install.sh

1.png

2.png

3.png

制作静态库的注意点

无论是 .a 静态库还是 .framework 静态库,最终需要的都是:

二进制文件 + .h + 其它资源文件

.a 和 .framework 的使用区别

.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用

.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

图片资源的处理

如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致

bundle的创建:新建一个文件夹,修改扩展名为.bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西

制作静态库的注意点

多文件处理

如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件

(一般 主头文件 和 静态库 同名)

在主头文件中包含所有其他需要暴露出来的 .h 文件

使用静态库时,只需要#import 主头文件

实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>

.framework为什么既是静态库又是动态库

系统的 .framework 是动态库

我们自己建立的 .framework 是静态库


4.png

静态库

  1. 静态库简介

1.什么是库?

就是程序代码的集合, 是共享程序代码的一种方式

2.库的分类?

开源库

公开源代码, 能看到具体实现

例如MJExtension, MJRefresh, AFNetworking...

闭源库

不公开源代码, 是经过编译后的二进制文件, 看不到具体实现

主要分为: 静态库
和 动态库

3.静态库的存在形式

.a

.framework

静态库的存在形式

.dylib

.framework

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

静态库在链接时,
会被完整的复制到可执行文件中; 被多次使用, 就有多份拷贝;

动态库则不会复制,
只有一份. 程序运行时动态加载到内存; 系统只加载一次, 多个程序共用, 节省内存;

但是!!!!
项目中如果使用到自己的动态库, 不允许上架!

6.静态库应用场景?

保护自己的核心代码

将MRC的项目,打包成静态库,
可以在ARC下直接使用, 不需要转换

注意:Xcode6以前是没有Cocoa Touch Framework这个选项的

1.png

1.都是利用第三方框架


2.png
  1. 静态库的制作

1.创建项目时, 直接选择静态库

2.设置需要暴漏的头文件

3.在模拟器环境下编译(得到模拟器环境下的静态库)

4.在真机环境下编译(得到真机环境下的静态库)

5.注意事项:

模拟器下的静态库和真机下的静态库不能共用

6.注意静态库所支持的架构

不同机型的CPU, 对应的架构不同; 模拟器: 4s----5 : i386

5s----6sPlus : x86_64

真机: 3gs---4s : armv7

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

5s---6sPlus: arm64

查看静态库支持的架构lipo -info 库文件

解决方案: Build Settings -> Build Active

7.合并静态库(模拟器和真机都支持)

lipo
-create 库1 库2 -output 终极库

注意点:合并后的静态库文件比较大(真机静态库 + 模拟器静态库)

8.Debug版本和Release版本

区别:

1.vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信
息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。

2.debug程序通常比release程序要慢,尤其是处理视频方便release要比debug快很多。在release模式对程序进行调试的时候经常会遇到变量虽然初始化了,但是在查看其值的时候却发现是一个随机的数并不是初始化的值,有时候在对变量进行监视的时候了,会出现找不到变量的情况,原因大致如下:

3.debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc, 而release的赋值近似于随机。如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到。debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了。

4.只有DEBUG版的程序才能设置断点、单步执行、使用
TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。

修改方案:

Edit Scheme

9.真正开发中的静态库制作

建立一个项目, 在项目中, 创建一个静态库; 好处: 可以调试静态库

framework 静态库制作

通静态库制造方法一致

默认情况下, 制作的是动态库

变成静态库

b s -> match

***********************黑马*********************


  1. 为什么要做静态库

================================================================================

1>
国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用

例如:百度地图,友盟,JPush等

2>
在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用

  1. 静态库的特点

================================================================================

.a + .h

  1. 静态库简单演练

================================================================================

1>
新建CZTools项目

2>
创建一个类方法,实现一个简单的加法

3>
编译

注意,在编译静态库时,需要编译两个版本 ->
真机(arm) | 模拟器(i386)

4>
新建项目将编译生成的.a + .h拖到项目中使用

  1. 静态库中的资源包的使用

================================================================================

问题:有些第三方库会使用到一些图片素材,例如公司的logo等。

但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。

在静态库中如果要使用图片素材,会创建一个文件后缀自行改为.bundle

1>
建立bundle,并且向其中添加图片

2>
创建一个类方法,返回图片

3>
编译

4>
调用方如果需要使用,需要导入.h + .a + XXX.bundle

  1. 静态库中的自定义视图

================================================================================

问题:程序需要测试

静态库如何测试呢?

创建复合项目

1>
复习块代码传值

  1. 静态库的使用

================================================================================

新建项目将编译生成的.a + .h拖到项目中使用

  1. 静态库的种类

================================================================================

静态库文件的版本(4种)

1.真机-Debug版本

2.真机-Release版本

3.模拟器-Debug版本

4.模拟器-Release版本

调试版本VS 发布版本


  • 调试版本会包含完整的符号信息,以方便调试

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

  • 发布版本不会包含完整的符号信息

  • 发布版本的执行代码是进行过优化的

  • 发布版本的大小会比调试版本的略小

  • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升

  1. 静态库的合并

================================================================================

检测.a的类型

$ lipo -info
libCZTools.a

合并.a

lipo -create
Debug-iphoneos/libCZTools.a Debug-iphonesimulator/libCZTools.a -output
libCZTools.a

合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试

合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的

今后在使用.a时一定注意版本

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

推荐阅读更多精彩内容

  • 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别...
    吃瓜群众呀阅读 11,604评论 3 42
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 仅以方便自己查阅记录前言1.静态库和动态库有什么异同?静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗...
    190CM阅读 4,023评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 这天晚上,放暑假的米米惬意的躺在沙发上看着泡沫肥皂剧来打发时间,手机突然响了,原来是沈旭发来的消息:米米在吗,给你...
    猫小姐的犬阅读 241评论 0 1