iOS 手动打包动态静态库

来源:互联网 发布:java并发是什么意思 编辑:程序博客网 时间:2024/06/07 02:40

一直觉得制作静态库、动态库特别高大上,今天比较闲想学习学习,发现网上有很多相关的文章,而且写的特别的好,特别的详细,真是对我这样的小白的恩赐啊!

原文地址:一篇较为详细的 iOS动态静态库创建打包方法 总结
作者:张仙森

原文地址:ios打包静态库,看这篇就够了
作者:夜_阑珊



概念

什么是库

库是共享程序代码的方式。库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。在开发过程中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成库,只暴露出头文件以供使用。库分静态库和动态库两种。


库的分类

a、静态库

存在 .a 和 .framework 两种形式。

.a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式。

b、动态库

存在.framework和.tbd两种形式。

在 iOS8 之前,苹果不允许第三方框架使用动态方式加载,从 iOS8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。虽然同样是动态框架,但是和系统 framework 不同,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 时会被放到 app bundle 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。


优劣

静态库,在链接时会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。
好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

动态库,与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
系统的动态库不需要拷贝到目标程序中,自建的动态库可以由工程内的多个库共享,因此可以减小目标程序的体积。但是,由于其把静态链接做的事情都搬到运行时来做,程序的启动会变慢。


库的创建

.framework动态库的创建

1、创建一个.framework动态库项目,如下图所示:

动态库

创建后的文件列表如下,可以看到只有一个 framework.h 头文件。通过注释,我们可以理解,这个头文件是所有 public 头文件的集合:

public头文件

2、创建一个用来测 试的文件

测试文件
输出字符串

3、选择需要暴露给别人使用的头文件

暴露头文件

4、将头文件导入到framework.h中

导入头文件

5、设置支持的类型

表示支持所有类型

6、现在可以打包这个动态库了。由于模拟器和真机 架 构 不同,需要选择该包将运行在哪个环境下,如下图所示,选择运行在真机上:

选择真机环境

7、运行打包你的动态库

8、查看生成的framework,Headers文件里是你所暴露的头文件

暴露的头文件

9、使用

新建一个项目,导入你的动态库,嵌入工程的bundle中,在使用的地方导入头文件,调用方法

嵌入bundle

使用

10、运行效果

运行


framework和动态framework创建的基本流程一致,唯一的区别需要设置 Mach-O Type 为 Static Library :

静态库设置


动态库中图片资源的使用

在 framework 中使用 storyboard/xib 创建的页面,可以直接访问 framework 中图片资源。但是 framework 中通过imageNamed:方式加载的照片都会丢失。这是因为 imageNamed:的方法默认是从 mainBundle 中查找资源的,而 framework 中的照片是从 framework 内部加载的,这是的 bundle 并不是 mainBundle ,而是存在于主程序的 docment 文件中的 framework 包,图片加载的路径发生了变化,自然找不到图片资源,所以需要修改加载图片的方法!

我们使用一个使用图片的View来举例说明

1、先创建bundle文件(这个其实就是一个文件夹)

bundle

bundle 一般和库命名相同。需要注意的是, bundle 并不会被打包进库中的,而是添加要单独添加到工程中,和 framework 相独立的两部分。向 bundle 中直接添加图片:

添加图片

我们的动态库中新增一个使用图片的视图文件:

使用bundle

// 两种使用bundle的方法[UIImage imageNamed:[[[NSBundle mainBundle] pathForResource:@"Frameworks" ofType:@"bundle"] stringByAppendingString:@"/Images/author.png"]][UIImage imageNamed:@"Frameworks.bundle/Images/author.png"]

同样的方法制作和使用动态库,重新导入我们的动态库,并将bundle一起导入

使用:

使用

效果:

效果

原创粉丝点击