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 头文件的集合:
2、创建一个用来测 试的文件
3、选择需要暴露给别人使用的头文件
4、将头文件导入到framework.h中
5、设置支持的类型
6、现在可以打包这个动态库了。由于模拟器和真机 架 构 不同,需要选择该包将运行在哪个环境下,如下图所示,选择运行在真机上:
7、运行打包你的动态库
8、查看生成的framework,Headers文件里是你所暴露的头文件
9、使用
新建一个项目,导入你的动态库,嵌入工程的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 并不会被打包进库中的,而是添加要单独添加到工程中,和 framework 相独立的两部分。向 bundle 中直接添加图片:
我们的动态库中新增一个使用图片的视图文件:
// 两种使用bundle的方法[UIImage imageNamed:[[[NSBundle mainBundle] pathForResource:@"Frameworks" ofType:@"bundle"] stringByAppendingString:@"/Images/author.png"]][UIImage imageNamed:@"Frameworks.bundle/Images/author.png"]
同样的方法制作和使用动态库,重新导入我们的动态库,并将bundle一起导入
使用:
效果:
- iOS 手动打包动态静态库
- 手动打包.a静态库
- iOS 打包静态库
- iOS打包静态库
- iOS 打包静态库
- 手动创建ios静态库
- iOS 静态库通用打包
- 把静态库打包成动态库
- 打包静态库和动态库
- 打包发布-静态库和动态库
- iOS静态库中打包图片资源
- iOS静态库中打包图片资源
- iOS 打包静态库.a文件
- iOS打包成.a静态库
- 【iOS开发】打包静态库.a文件
- 【iOS开发】打包静态库.a文件
- 【iOS开发】打包静态库.a文件
- iOS打包.a静态库步骤
- Qt 静态回调函数,访问类成员变量,解决办法
- SpringMVC通过工具类获取Request域
- linux环境下安装PHP的OpenSSL扩展
- crontab 定时写法整理
- iOS开发之旅(1):实现一个APP界面框架
- iOS 手动打包动态静态库
- java 泛型
- ToolTip.js 的使用介绍
- 判断元素是否在可视区域内
- 通过scheme打开另一个APP
- 第一章 PX4-Pixhawk-程序编译过程解析
- C++实现对简单的文件读写
- javascript中new Date()的浏览器兼容性问题
- java 字节流与字符流的区别