iOS实用技能扩展-静态库的制作与简单使用

前言:此文是关于静态库的概念描述,如何制作及简单调试使用,不同版本的说明与场景使用。

1.关于库的简介:

  库可以分为2种类型

  1. 开源库
    1. 公开源代码,能看到具体实现
    2. 比如SDWebImage、AFNetworking
  2. 闭源库
    1. 不公开源代码,是经过编译后的二进制文件,看不到具体实现
    2. 主要分为:静态库、动态库

2.静态库的特点:.a+.h;

为什么制作闭源库

  1. 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等
    1. 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用
      1. 静态库与动态库
      2. 静态库和动态库的存在形式
        1. 静态库:.a 和 .framework
        2. 动态库:.dylib(Xcode7.0之前) .tbd[Xcode7以后] 和 .framework
    2. 静态库和动态库在使用上的区别
      1. 静态库:链接时,静态库会被完整地复制到可执行文件中,被多个应用使用就有多份冗余拷贝(左图所示)
      2. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(下图所示)

         3.(可忽略,因为目前比较少使用xcode6了)需要注意的是:项目中如果使用了自制的动态库,在Xcode6之前不能被上传到AppStore,Xcode6以后可以上传AppStore。


 

3.静态库的简单制作

1>  新建Tools项目


2>  创建一个类方法,实现一个简单的加法

  • Tools.h文件
  + (double) sumNum1:(double) x andNum2:(double) y;
  • Tools.m文件
    + (double)sumNum1:(double)x andNum2:(double)y
     {
         return  x + y;
     }


3>  编译
  #   注意,在编译静态库时,需要编译两个版本 -> 真机(arm) | 模拟器(i386)

    • 查看文件导航栏->Product->libTools.a文件,如果为红色表示没有生成.a文件,如果是黑色表示生成了.a文件
    • 仅仅编译模拟器不会生成.a,需要在真机下编译才能生成.a文件
    • 选中.a文件->右击->showFinder 如图,生成两个.a文件,一个用于真机,一个用于模拟器


4>  测试生成的静态库

新建ToolsTest的iOS项目

  1. 将编译生成的模拟器的.a + .h拖到项目中使用
  2. 在ViewController.m导入Tools.h文件
  3. 使用调用类方法 + (double) sumNum1:(double) x andNum2:(double) y;
   - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   double rs = [Tools sumNum1:10 andNum2:20];
   NSLog(@"%lf",rs);
}

输出结果:30


 

4.静态库中的资源包的使用

问题:有些第三方库会使用到一些图片素材,例如公司的logo等。但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。在静态库中如果要使用图片素材,会利用bundle的手段.
步骤:
1>  建立bundle,并且向其中添加图片
2>  创建一个类方法,返回图片
3>  编译
4>  调用方如果需要使用,需要导入 .h + .a + XXX.bundle


 

5.静态库的合并(因为在模拟器与真机的运行架构不一样,所以两个平台不能通用)
把模拟器调整到iphone5,编译报错


# 检测.a的类型
$ lipo -info libCZTools.a
# 合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a


如何让生成.a文件支持i386?

合并静态库

  1. 通过终端命令可以将静态库进行合并: lipo -create 静态库1.a 静态库2.a -output 新静态库的名称.a 如图:

  2.查看生成后的静态库 如图:

测试生成后的静态库

    1. 把测试项目中原来的的.a文件替换成为新的.a文件
    2. 分别在4s,6s和真机下运行测试项目


# 合并.a的好处:开发过程中既可以在真机上调试,也可以在模拟器上调试
# 合并.a的坏处:如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
# 今后在使用.a时一定注意版本


 

6.如何生成发布版静态库

  1. 默认情况下生成的版本都是调试版静态库,如何生成发布版的静态呢?
  2. 步骤:

    1. 编辑scheme 

    2. 配置运行为发布

  3. 再编译静态库(模拟与真机上都要),生成发布版静态库
    1. 发布版真机版 Release-iphoneos
    2. 发布版模拟器版 Release-iphonesimulator

 

补充:

01-架构解析
Undefined symbols for architecture i386 : 未定义的符号在i386架构
现在的静态库在i386架构上面是不可以使用

模拟器:
iPhone4s-->iPhone5 : i386
iPhone5s-->iPhone6plus : x86_64

真机:
iPhone3gs-->iPhone4s : armv7
iPhone5-->iPhone5c : armv7s
iPhone5s-->iPhone6splus : arm64

通过下列命令查看静态库支持哪些架构:lipo -info 静态库.a
通过下列命令可以将静态库进行合并:
lipo -create 静态库1.a 静态库2.a -output 新静态库的名称.a

02-静态库的种类
================================================================================

静态库文件的版本(4种)
1.真机-Debug版本
2.真机-Release版本
3.模拟器-Debug版本
4.模拟器-Release版本

调试版本(Debug版本) VS 发布版本(Release版本)
--------------------------------------------------------------------------------
- 调试版本会包含完整的符号信息,以方便调试
- 调试版本不会对代码进行优化

- 发布版本不会包含完整的符号信息
- 发布版本的执行代码是进行过优化的
- 发布版本的大小会比调试版本的略小
- 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升

 

posted @ 2016-06-18 11:26  码锋窝  阅读(269)  评论(0编辑  收藏  举报