按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程.

在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下.

一.静态库和动态库的详细介绍.

我们平时的工程中或多或少都要引入第三方的SDK,至少引用过系统的framework。其实这些SDK和Framework都属于库,库又分为静态库和动态库。我们平时导入的第三方SDK有的事Framework,有的是 .a。到底哪些是动态库,那些是静态库呢。下面我们分别介绍静态库,动态库,Framework和.a以及.tbd的区别。

二.静态库和动态库

首先解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况会用到库:

<1>.某些代码需要提供给别人用,但是不希望别人看到我们的源码,就需要一库的形式进行封装。只暴漏出头文件。

<2>.对于某些不会进行大的改动的代码,比方说很多大公司常用且很少改变的模块都会编译成库。这样做的好处一是可以节省编译时间,二来是对于代码的管理也非常方便。

因为库是已经编译好的二进制文件了,编译的时候只需要link一下,既然提到了link那就有不同的形式了,静态和动态,与之对应的就是静态库和动态库。

1.静态库

平时我们使用到的第三方SDK基本上都是静态库,静态库有几个特点:

<1>在App编译的时候,会拷贝一份编译到目标程序中,相当于将静态库嵌入了,所以得到的App二进制文件会变大.

<2>在使用的时候,需要手动的导入静态库所依赖的其他类库。(比如说某个SDK中使用到了CoreMotion.framework,在使用的时候,需要手动导入.)有的SDK需要Link是几个系统库,只能一个一个的手动加或者使用第三方库管理工具。这也是静态库的一个很大的不方便之处)

<3>导入静态库的应用可以减少对外界的依赖,如果导入的是第三方动态库,动态库找不到的话应用就会崩掉 。

<4>静态库很大的一个优点就是减少耦合性,因为静态库中是不可以包含其他静态库的,使用的时候需要另外导入他的依赖库,最大限度的保证了每一个静态库都是独立的。

2.动态库

这是我们最常用的一类库,使用频率最高的UIKit.framework和Fundation.framework 都属于动态库,所有.dylib和.tbd结尾的都属于动态库,动态库的几个特点:

<1>.平时使用的系统库都放在iOS的系统中,在你打包应用程序的时候这些库不会拷贝到你的程序中,当需要的时候会动态的从iOS系统中加载他们,因为这个原因,动态库也被称为共享库,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码.

<2>.这些库是所有的应用公用的,换一种说法就是节省了应用安装包的体积,这是区别静态库的一个很重要的特点,因为静态库使用一次就拷贝一次,非常的浪费资源.

<3>.动态库在使用的时候不需要再次link依赖库,即导即用。唯一需要注意的就是在导入自己制作的动态库是,需要在Embedded Binaries中导入,不然会报错:image not found。此时这个动态库会跟静态库一样被拷贝到目标程序中进行编译苹果又把这种Framework叫做Embedded Framework

关于动态库要搞清楚一点,我们自己制作的动态库与系统动态库的区别,我们自己制作的动态库引入App项目的时候需要embed进项目,也就是要拷贝到目标程序中,这就有点不像动态库的特性了,苹果这么做也是考虑安全问题吧!

三 Framework  .a .dylib/.tbd

1.Framework

Framework的英文意思是框架,主要由Headers,binary文件,.bundle这三个部分组成,除此之外还有info.plist和Modules,后两者主要记录Framework的版本之类的信息,一般都会删掉.

<1>Headers

包含我们在制作Framework的时候暴漏的头文件,所以被暴漏的.h都房子啊这里.

2.binary文件

整个Framework的核心,所有代码都被编译成了这样一个二进制文件,这里需要注意的是添加的依赖库不会被编译进来,用的时候还需要重新link其他依赖库

.bundle文件

资源文件都打包放在这里。在制作Framework的时候不可以把图片直接放在项目中,否则制作好之后图片是一张一张出现在项目中,非常乱。需要新建一个bundle将图片放进去,这里的bundle提供整个SDK的图片资源.需要注意的是图片放进bundle之后,不可以使用[UIImage ImageWIthName:]读取图片,要先找到bundle包在拿图片.

Framework既可以是静态库也可以是动态库,这取决于编译成的Mach-O(就是那个二进制文件)是动态库还是静态库,Framework本质上并不是一个库,它是苹果为了防拜年开发者提供的一种库的打包方式,Framework会将Mach-O文件,头文件,和资源包全都包含起来,不需要你手动整理。我们也可以通过Xcode来制作framework动态库使用。

2 .静态库

这类静态库与framework基本类似,不同的是在打包成.a文件的同时,还需要提供头文件,使用时相较于Framework比较麻烦。.a这样打包不够方便,而Framework编译完成暴漏的文件都已经放好了.

3 .dylib/.tbd 动态库

这类库我们也经常使用,基本上都是系统提供的,一般不自己制作,就算你通过其他的方式制作使用,也可能上不了架的。

四 静态库的制作

<1> .a静态库的制作

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

(2)设置需要暴漏的头文件

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

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

自己做了一下 感觉挺简单的 但是截图太麻烦 这里贴一下我搜索的资料 看看就很明白了。

.a 静态库的制作步骤详解

<2> Framework的制作

其实 这个也挺简单的 这里我也只贴一下我找的比较简单易懂的资料

framework SDK的制作

五 如果打包包含第三方的framework

看看这里

https://www.jianshu.com/p/68c0f40a3387

https://www.jianshu.com/p/6790fc295f48

iOS 静态库的制作的更多相关文章

  1. iOS静态库的制作与引用

    [iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...

  2. iOS静态库.Framework制作

    首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库: 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式 ...

  3. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  4. iOS静态库.a文件制作和导入使用

    iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...

  5. iOS : 静态库制作

    一.静态库简介 1. 什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式 2. 库的分类? 开源库 公开源代码, 能看到具体实现 例如MJExtension, MJRefresh, AFN ...

  6. iOS开发之静态库的制作

    当你需要和别人分享代码,但又不想让别人看到你内部的实现时就需要制作静态库,通常用于第三方SDK 下面就分享一下制作静态库(.a)的过程: 1.打开Xcode,新建workspace 2.随便给work ...

  7. IOS静态库

    如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...

  8. iOS静态库转Framework动态库

    参考文章: iOS静态库(.a 和framework)  XCode6制作动态及静态Framework  说说iOS中静态库的开发  dyld: Library not loaded: @rpath/ ...

  9. iOS - 静态库的创建与使用

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...

随机推荐

  1. 将DataSet转换成json

     /// <summary>        /// 把dataset数据转换成json的格式        /// </summary>        /// <para ...

  2. 在CMD中查看端口被什么程序占用

    我们要查看端口被什么程序占用,可以使用下面方法.比如端口28848 1. 打开cmd,输入命令netstat -ano | findstr ":28848",显示结果如下,最后一个 ...

  3. C# 6.0语法糖剖析

    C# 6.0语法糖剖析 2016年12月16日 16:10:27 阅读数:586   版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载. https ...

  4. 关于SVN提交强制加入注释

    一.摘要 场景: 在这次开发项目过程中,团队中总是有人忘记添加注释. 问题: 1:其他成员不知道你提交是什么代码, 给回滚操作带来很多不必要的麻烦. 2:这个工作需要有一个人天天提醒大家在提交代码的时 ...

  5. Retrofit2和RxJava配合使用Demo

    和Retrofit2单独使用有一些区别 首先,同样写个interface,这里是GitHubService.java,我们这次要实现获取官方提供的测试接口的数据 public interface Gi ...

  6. curl Error : maximum redirects followed , 这种问题的一种原因 .

    在stack overflow 上查找到有些网站上需要返回一些cookie的,所以当我们curl当相应的网站时,必须要将返回的cookie保存起来. $cookie = tempnam (" ...

  7. 谈谈varnish,squid,apache,nginx缓存的对比

    总是有人在问cache用什么,有varnish,squid,apache,nginx这几种,到底是我们用什么架构cache. 1.从这些功能上.varnish和squid是专业的cache服务,而ap ...

  8. vue 过滤与全文索引

    过滤 与 全文索引 <template> <div> <input type="text" v-model="query"> ...

  9. java正则表达式基础知识(转)

    1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...

  10. Google I/O 2014 大会总结 Android开发新方向

    昨天晚上,Google I/O 2014大会召开,会上主要展示了下面几个部分的创新内容: Android L 操作系统 首先是界面,谷歌又一次设计了一套 UI 规范.并称之为"Materia ...