静态库


一、什么是库?

:就是程序代码的集合,是共享程序代码的一种方式


库的分类开源库闭源库


  • 开源库:源代码公开,能看到具体代码实现 比如:AFNetworking、SDWebImage
  • 闭源库:源代码不公开,看不到具体实现,看到的是编译后的二进制文件

二、闭源库

闭源库: 静态库动态库


静态库

  • 以 .a文件 .framework文件形式存在
  • 应用场景:保护核心代码,但同时希望更多程序员使用 如:友盟、百度地图
  • 注意:将MRC的项目,打包成静态库,可以直接在ARC下使用,不需要转换

动态库

  • 以 .dylib 和.framework文件形式存在

静态库动态库的区别:

  • 静态库在链接时,会被完整的复制到可执行文件中,被多次使用,就有多份拷贝;
  • 动态库则不会复制,只有一份,程序运行时动态加载到内存,系统只加载一次,多个程序共用,节省内存;
  • 但是项目中如果使用到自己的动态库,苹果不允许上架!
  • WWDC2014苹果iOS8开放动态dylib的接口,也就是开放了动态库挂载!

三、创建静态库

1、创建项目时,直接创建静态库.a或者.framework

静态库_第1张图片
创建 .a或者 .frameWork静态库

2、选择.a静态库:
添加需要暴露的头文件,此时还没有真正生成静态库


静态库_第2张图片
制作.a静态库步骤.png

3、选择模拟器或者真机编译生成静态库
command+B 编译生成 .a静态库 (libabc.a变色)


静态库_第3张图片
真机、模拟器.png

4、查看 .a静态库 、.framework静态库


静态库_第4张图片
查看.a静态库、.framework静态库.png

5、模拟器下的静态库和真机下的静态库不能共用:

模拟器和真机CUP架构不一样,并且各个模拟器型号之间架构也不一样


  • 静态库文件架构:
    模拟器:
    iPhone 4s~5: i386
    iPhone 5S~6sPlus: x86_64
    真机:
    iPhone 3gs~4s:armv7
    iPhone 5~5c: armv7s(armv7兼容armv7s)
    iPhone5s~6sPlus: arm64
    如何查看静态库支持的架构:
    命令行窗口中(终端):lipo -info 库文件
    如何一次编译多个架构的.a静态库(能在多种架构下运行):表示让所有的框架都编译
    静态库_第5张图片
    编译多个架构的.a静态库.png

  • 静态库文件的版本:
    调试版本: 真机Debug版本 和 模拟器Debug版本
    特点:
    1、调试版本会包含完整的符合信息
    2、方便调试
    3、不会对代码进行优化
    发布版本:真机Release版本 和 模拟器Release版本
    特点:
    1、发布版本不会包含完整的符合信息
    2、会对代码进行优化
    3、版本大小会比调试版本略小
    4、发布版本比调试版本执行速度’稍微‘有提升

如何生存不同版本:
项目->Edit Scheme-> Run -> Release/Debug 分别进行编译


静态库编译版本.png

静态库_第6张图片
静态库编译版本+.png

6、如何生成一个静态库能在模拟器上和真机上都能运行?(因为支持框架不同,所以没法同时运行)

  • 首先需要生成真机版本模拟器版本
  • 将静态库合并(合并.a)
    合并步骤:
    终端命令: lipo -create 第一个.a库文件路径 第二个.a库文件路径 -output 合并.a库文件名
    合并优点:开发过程中可以在真机和模拟器上调试
    合并缺点:合并后库文件太大

7、制作.framework库文件

设置编译多个架构
![编译多个类型].png](http://upload-images.jianshu.io/upload_images/1170347-f644dab6cc42c83f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
但是默认是动态库,需要设置连接类型 target -> BuildSetting->搜索Mach-o Type:改为静态库

静态库_第7张图片
framework静态库连接类型.png


8、.a静态库和.framework静态库的区别?

  • .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件
  • .a文件不能直接使用,至少要有.h文件配合;.framework文件可以直接使用
  • 相当于.a+.h+sourceFile = .framework
  • 建议使用.framework

四、使用

注意:首先查看使用的库文件支持的库文件架构

  • 导入库文件
  • 如果.a静态库文件记得拖入对应的.h文件

你可能感兴趣的:(静态库)