制作第三方SDK静态库、.framework
静态库和动态库的存在形式
- 静态库: .a 和 .framework
- 动态库: .dylib 和 .framework
静态库和动态库的使用区别:
- 静态库:链接时,静态库会被完整地复制 到 可执行文件中, 缺点: 【被多次使用,就有多份冗余拷贝】
- 动态库:链接时不复制,程序运行时由系统动态加载到内存里,供程序调用,系统只加载一次!多个程序共享资源,节约内存!
注意:项目中如果使用了自制的动态库,不能被上传到AppStore, 除非你越狱了。
-
区别:.a 静态库 和 .framework
共同点: 最终都是 转化为 二进制文件 + .h 文件 + 其它文件,才能使用。
- 1、 .a 和 .framework 的使用区别
- 2、 .a 本身是一个二进制文件,需要配上 .h 和其它资源文件才能使用。
3、.framework 本身已经包含了 .h 和其它资源文件。说白了就是它包含了所有东西。
-为什么要做静态库
1> 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
例如:百度地图,友盟,JPush等
2> 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用
02. 静态库的特点
.a + .h ,.a配合上公共的 .h 文件,我们可以获取到 .a 中暴露的方法或者成员等,你不能控制加载的方式和时机.
- 在 iOS 8 之前,iOS 只支持以静态库的方式来使用第三方的代码。
03. 静态库简单演练
1> 新建XXX项目
2> 创建一个类方法,实现一个简单的加法
3> 编译
注意,在编译静态库时,需要编译两个版本 -> 真机(arm) | 模拟器(i386)
4> 新建项目将编译生成的.a + .h拖到项目中使用
04. 静态库中的资源包的使用
问题:有些第三方库会使用到一些图片素材,例如公司的logo等。
但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。
在静态库中如果要使用图片素材,会利用bundle的手段
1> 建立bundle,并且向其中添加图片
2> 创建一个类方法,返回图片
3> 编译
4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle
1、创建工程
2、导入已经创建好文件(这里使用的是MJ大神的框架,记得14年,那时他才刚开始写这个库,现在已经超5K 颗心了,挺牛的哈!)
-
3、按步骤演示:
4、多了一个头文件
5、紧接着是,暴露头文件, .h 文件
5.默认是Project ,你把它拖到Public 就可以了!
这里要注意了:静态库分真机和 模拟版本的,请看:
6、真机制作,很简单:
之前,Products 是红色的,现在经过 第6 步之后就为 黑色的了:
- 变黑色:
- 选择点击,右击--》Show in Finder 进去看看:
6.1 同理,模拟的步骤也一样,这里就不说了。
6.2 把公共的文件合并。
6、3使用命令行:
- 然后,紧接着输入: open ./
7、到此,我们要测试该库了
- 7.1 我们新建一个新项目测试一下:
- 1、我们新建一个新项目 TestMJExtention
- 2、在桌面新建一个例如:MJExtention 的文件夹
- 3、把 合并好的libMyExtentsion.a 和 .h 头文件 拖到 MJExtention 的文件夹 里
- 4、最后,把 MJExtention 的文件夹拖到工程里,就可以了。
- 看图:
- 导入 MJExtention.h 然后调用相应地方法,就可以了。
-注意:解决静态库包含的分类问题。
好,上面是不包含别人的框架的。现在是,我的静态库,要包含第三方的库。打个比方,我现在是A公司,我A公司的SDK要包含 QQ的库或框架。那该怎么实现呢?
1、首先 我们下载MJRefresh,然后把它的库拖进我们的工程就可以了。当是要注意!!bundle 是不能够导进去的。编译不通过,所以,我们在拖 MJRefresh 库时要忽略 那库。等到合并完毕后,桌面新建文件夹时或直接在工程了新建文件夹,把 bundle 和 合并的.a 一起拖到 文件夹就OK了。
看图:
使用MJRefresh框架.png其实下面的步骤和上面的基本一样:
- 1、创建一个工程 TestMJFresh,记得是 库工程啊!库工程啊!库工程啊 ,看图:
- 2、在桌面新建一个文件夹,这里我命名为:MJFile
- 3、 导入工程
- 4、操作和之前一模一样了,就是 导入想要的 .h 文件到 Public, 然后通过命令行合并,最后,新建工程测试咯!
05. 静态库中的自定义视图
问题:程序需要测试
静态库如何测试呢?
创建复合项目
1> 复习块代码传值
06. 静态库的使用
新建项目将编译生成的.a + .h拖到项目中使用
07. 静态库的种类
静态库文件的版本(4种)
1.真机-Debug版本
2.真机-Release版本
3.模拟器-Debug版本
4.模拟器-Release版本
调试版本 VS 发布版本
- 调试版本会包含完整的符号信息,以方便调试
调试版本不会对代码进行优化
发布版本不会包含完整的符号信息
- 发布版本的执行代码是进行过优化的
- 发布版本的大小会比调试版本的略小
在执行速度方面,调试版本会更快些,但不意味着会有显著的提升
静态库的合并
检测.a的类型
$ lipo -info libCZTools.a
合并.a
lipo -create Debug-iphoneos/libCZTools.a Debug-iphonesimulator/libCZTools.a -output libCZTools.a
合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
今后在使用.a时一定注意版本
原文链接:http://www.jianshu.com/p/808d1c40776a
制作第三方SDK静态库、.framework的更多相关文章
- 制作第三方SDK静态库、.framework(修正)
静态库和动态库的存在形式 静态库: .a 和 .framework 动态库: .dylib 和 .framework 静态库和动态库的使用区别: 静态库:链接时,静态库会被完整地复制 到 可执行文件中 ...
- iOS静态库.Framework制作
首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库: 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式 ...
- xcode6制作IOS .a静态库小记
xcode6制作IOS .a静态库小记 创建iOS静态库 简单写个打印的代码 编码完成之后,直接Run就能成功生成.a文件了,选择 xCode->Window->Organizer-> ...
- iOS制作Static Library(静态库),实现多工程的连编
在iOS开发中,我们会发现一些偏底层或基础代码是直接可以复用的,当我们换一个项目,改变的只需要是偏上层的业务逻辑代码,所以我们可以把这部分基础代码制作为一个静态库static library,并不断扩 ...
- 关于VS2013下制作和使用静态库和动态库
关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接.将一个程序编译成可执行程序的步骤: 静态库在链接阶段,会将汇编生成的目标 ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- iOS 动态库、静态库 . framework 总结(2017.1.25 修改)
修改于2017.1.25 使用Xcode Version 8.2.1 1.怎么创建.framework? 打开Xcode, 选择File ----> New ---> Project 选择 ...
- Linux下制作和使用静态库和动态库
概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib. 静态函数库: 这类库的名字一般是libxxx. ...
- 如何打包静态库.framework文件 iOS
代码调试好了开始打包成sdk,下面是将要打包的FRSDK代码(FRSDK.h暴露在外面有别人调用) 1.创建新工程(Xcode File-New-Project) 2.把下面的红色框的东西移除 3.将 ...
随机推荐
- Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果)
在个别时候,需要强制隐藏Android输入法键盘,如当前键盘正在显示,这个时候点击了侧滑面板,就要强制隐藏输入法键盘.网上常见的方法有: 1. InputMethodManager imm = (In ...
- python学习笔记三--字典的使用
一.基本使用: 1. 赋值:{key:value} 1.1 与列表相同处:会改变索引(键)相关联的值的改变 1.2 与列表不同处:不用考虑值的长度,而列表是有序的需要考虑末尾偏移量,超过末尾偏移量的会 ...
- RTL 与 technology schematic的区别,包含概念与实例
2013-06-25 16:40:45 下面是xilinx官网上的问答贴: http://china.xilinx.com/support/answers/41500.htm#solution The ...
- 细说javascript 中的 window.open() 参数设置
今天遇到一个问题,就是要用javascript中的window.open()打开一个新的网页,而且新打开的网页要在原来网页的基础之上,在查了一些资料之后,找到里一下方法:(其中,url 为链接的地址) ...
- xp主机用VMware9和10安装Ubuntu12.04后无法进入图像界面
xp主机用VMware9和10安装Ubuntu12.04后无法进入图像界面 备注:虚拟机安装Ubuntu12.04 64位版本 刚开始我用VMware-workstation-full-8.0.3来安 ...
- 【HDOJ】3948 The Number of Palindromes
后缀数组求不重复回文子串数目.注意dp数组. /* 3948 */ #include <iostream> #include <sstream> #include <st ...
- fiddler代理
对于前段开发人员,fiddler 是一个必不可少的调试神器.下载地址:http://www.telerik.com/download/fiddler. 有同学也许会碰到,chrome 下 fiddle ...
- Spring事务隔离级别和传播特性
相信每个人都被问过无数次Spring声明式事务的隔离级别和传播机制吧!今天我也来说说这两个东西. 加入一个小插曲, 一天电话里有人问我声明式事务隔离级别有哪几种, 我就回答了7种, 他问我Spring ...
- HTML入门基础教程相关知识
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
- Hibernate4.x之映射关系--单向一对多
在领域模型中,类与类之间最普遍的关系就是关联关系在UML中,关联是有方向的 以Customer和Order为例:一个用户能发出多个订单,而一个订单只能属于一个客户.从Order到Customer的关联 ...