iOS- 静态库、动态库、Bundle

静态库:.a文件、framework文件
动态库:.tbd文件、framework文件
Bundle: 资源文件

一、概念

什么是库?
库是共享程序代码的方式,本质上来讲是一种可执行代码的二进制格式文件,可以被载入内存中执行。分静态库和动态库。

开发者自己创建的framework 叫Cocoa Touch Framework,和系统提供的那个framework不一样,开发者创建的framework会被放到app bundle中,运行在沙盒里。也就是说不通的app就算使用了同样的framework,但还是会有多份的框架被分别签名、打包和加载。

App Extension功能,可以为一个应用创建插件,这样主app和插件之间可以共享动态库。

静态库和动态库区别:

  1. 静态库会被完整的复制到可执行文件中,如果静态库被多次使用就有多份拷贝。还有个缺点,如果有多个静态文件,那么多个静态文件的文件名以及静态变量名不能重复,否则编译会报错或报找错对象。
  2. 动态库,在编译时不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。需要注意:系统的动态库不需要拷贝到目标程序中,自己建的动态库可以由工程内的多个库共享,因此可以减小目标程序的体积,但是由于把静态链接做的事情搬到运行时来做,程序的启动会变慢。

二、.a的创建

  1. 新建Project,选择Cocoa Touch Static Library。


    a文件制作.png
  2. 默认会有一个和工程同名的.h和.m文件,我们再新建一个Class并添加一个方法。


    新建Class.png
  3. 设置需要公开的.h头文件(点击+添加需要暴露出来的.h文件)。


    暴露头文件.png
  4. 分别在模拟器和真机下运行工程,右键Products下面的文件show in finder, 可以看到Products下面有2个文件夹,分别是真机运行的包和模拟器运行的包。


    image.png
  5. 将Debug-iphonesimulator文件目录下的libstaticFrameworkCreate.a和staticClass.h 和staticFrameworkCreate.h这三个文件拷贝到自己新建的一个文件夹中,如下图。同理将Debug-iphoneos下的这3个文件拷贝到另一个新建的文件夹中。


    image.png

6.利用lipo 命令将刚刚新建的两个文件夹打包成一个可以发布的.a文件。
具体的可以参见GPUImage集成 -- .a文件合成

三、framework创建

  1. 步骤和创建.a基本一致,新建Project时选择Cocoa Touch Framework。


    image.png
  2. 创建自定义的类并实现一个方法。


    image.png
  3. 设置需要暴露出来的.h文件。


    image.png
  4. 在模拟器上Run一次,右键Products下的FrameworkCreate.framework,并show in finder,可以获得一个framework文件。


    image.png
  5. 将该Framework添加到我们的工程中,并在General-Embedded Binaries中添加一下该Framework。


    image.png

注意如果不手动添加一下framework,可能会报如下错误


image.png
  1. 这样就可以正常调用我们自己的framework了。


    image.png
  2. 在第4步中,在真机上Run一次之后就可以获得支持真机的framework。


    image.png
  3. 将上面生成的两个framewrok文件拷贝到我们自己的文件夹下。


    image.png
  4. 利用命令行生工具生成真机和模拟机都可以使用的framework。


    image.png

注意:lipo -create 真机FrameworkCreate文件路径 模拟器FrameworkCreate文件路径 -output 模拟器FrameworkCreate文件路径


image.png
  1. 将修改后的.framework导入到我们的项目中就可以使用了。


    image.png

思考:从gitHub上下载下来的工程如何知道是Single View App 还是.a 或是framework了?对看图标
image.png

image.png
image.png

推荐阅读更多精彩内容