zoukankan      html  css  js  c++  java
  • 静态库和动态库

    简介

    什么是库? 

      1. 库是程序代码的集合,是共享程序代码的一种方式
    1. 根据源代码的公开情况,库可以分为2种类型

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

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

    静态库

    静态库的特点

    .a +.h

    制作静态库简单演练

    1. 步骤

      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)
        1. 查看文件导航栏->Product->libTools.a文件,如果为红色表示没有生成.a文件,如果是黑色表示生成了.a文件
        2. 仅仅编译模拟器不会生成.a,需要在真机下编译才能生成.a文件
        3. 选中.a文件->右击->showFinder 如图,生成两个.a文件,一个用于真机,一个用于模拟器 
    2. 测试生成的静态库 

      1. 新建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.4 andNum2:20.5];
           NSLog(@"%lf",rs);
        }
        

        输出结果:30.9

    带有资源的静态库

    1. 步骤:简单静态库的基础上

      1. 创建一个资源工具类CZResourceTools
      2. 导入图片资源
      3. 提供获取图片资源的方法

         + (UIImage *) logoOfItcast;
        
        + (UIImage *) logoOfItheima;
        
        + (UIImage *) lufei;
        
      4. 编译,编译后的include文件夹中没有我们刚刚添加的CZResourceTools.h文件,解决方法 项目->TARGETS->Build Phases->Copy Files->添加 需要头文件 如图 

        1. 测试,修改测试测试项目
        2. 删除之前导入.h+.a文件
        3. 导入新生成的 .h + .a 文件
        4. 在ViewController导入CZResourceTools.h
        5. 实现如下代码
        - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
        {
            UIImage *image = [CZResourceTools logoOfItcast];
            NSLog(@"%@",image);
        }
        

        5.点击屏幕输出内容为: 

        ToolsTest[2260:252976] (null)
        

        这是因为.a 文件中仅仅包含二进制的代码,不包含资源文件,如果你需要是资源还要把资源导入 6.导入静态库中使用的资,运行点击屏幕输出内容:

         ToolsTest[2276:256084] <UIImage: 0x7fbf7bc25b30>, {202, 76}
        

        这样使用静态库非常麻烦,并且与当前项目的资源混杂在一起,容易丢失

    2. 当静态库中包含一些固定的资源文件时候最好打包一个bundle,方便其他人使用

       1. 新建一个文件夹命名为:resource(此处你可以根据需要随意命名)
      
      1. 把需要的资源拖入当前文件夹
      2. 为给文件夹添加后缀.bundle
      3. 修改资源加载路径,文件前面添加包路径

        + (UIImage *) logoOfItcast
        {
           return [UIImage imageNamed:@"resource.bundle/logo_itcast.png"];
        }
        
        + (UIImage *) logoOfItheima{
           return [UIImage imageNamed:@"resource.bundle/logo_itheima.png"];
        }
        
        + (UIImage *) lufei{
           return [UIImage imageNamed:@"resource.bundle/logo_itheima.png"];
        }
        
        1. 编译,测试, 替换ToolsTest项目中.a,.h文件并导入resource.bundle文件即可.
      4. 运行,点击屏幕,输出内容:

        ToolsTest[2276:256084] <UIImage: 0x7fbf7bc25b30>, {202, 76}

    静态库的版本

    静态库的四个版本

    1. 真机-Debug版本
    2. 真机-Release版本
    3. 模拟器-Debug版本
    4. 模拟器-Release版本
    

    调试版本(Debug版本) VS 发布版本(Release版本)

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

    如何生成发布版静态库

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

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

    静态库与CPU架构

    1. 把模拟器调整到iphone5,编译报错
      1. 错误如图所示 
      2.  
      3. 错误原因:导入的.a文件,不支持模拟iPhone5的CPU架构i386
    2. CPU架构说明: 
       1. 模拟器CPU架构: 
           1. iPhone4s,iPhone5->`i366`
           2. iPhone5s以后->`x86_64`
       2. 真机CPU架构: 
           1. iPhone3gs-->iPhone4s : `armv7`
           2. iPhone5-->iPhone5c : `armv7s`
           3. iPhone5s-->iPhone6plus : `arm64`
      
    3. 通过终端命令查看.a文件所支持的CUP架构  lipo -info 静态库.a 
      1. not a fat file : 说明该.a文件不支持多重架构
      2. architecture: x86_64 : 说明该.a 支持x86_64架构
    4. 如何让生成.a文件支持i386: 
      1. Build Settings -->Build Active Architecture Only-->NO,如图:
      2.  
      3. 重新编译:
        1. product->clear
        2. 模拟器下编译
        3. 真机下编译
      4. 再次查看模拟所支持的架构 
    5. 合并静态库
      1. 通过终端命令可以将静态库进行合并: lipo -create 静态库1.a 静态库2.a -output 新静态库的名称.a如图:
      2. 查看生成后的静态库 如图:
    6. 测试生成后的静态库
      1. 把测试项目中原来的的.a文件替换成为新的.a文件
      2. 分别在4s,6s和真机下运行测试项目

    制作framework 使用framework制作动态库

    1. 使用framework制作动态库

      1. 创建一个framework项目,
        1. 注意:framework项目中不可以包含特殊字符
          1. 创建一个名称为预习01-framework制作编译,报错如下 
          2. 删除原来项目重新创建一个MakeFrawork项目
          3. 一个framework默认就有一个与项目同名的主头文件,该头文件用于包含其他的头文件,当用户使用这个framework的时候,只需要导入主头文件即可
      2. 创建CZTools的工具类
      3. 实现一个简单的类方法
      4. 让头文件暴露在外部

        
        

      5. 设置支持多种架构(与静态库相同) 
        
        
      6. 编译framework(需要模拟器和真机上都进行编译)
      7. 测试framework

        1. 创建测试项目FrameworkTest
        2. 导入MakeFramework.framework
        3. ViewController.m中导入头文件 
          • 格式:#import <MakeFramework/MakeFramework.h>
        4. 调用framework中的方法

           #import <MakeFramework/MakeFramework.h>
           @interface ViewController ()
           @end
          
           @implementation ViewController
          
           - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
           {
              int rs = [CZTools sumOfNum1:10 andNum2:20];
               NSLog(@"%d",rs);
           }
          
           @end
          
        1. 运行测试项目,报错:

          错误原因:默认情况下framework是动态库,使用的时候还需要添加到 embedded binaries (被嵌入的二进制)
          1. 第一步:target->general->embedded binaries->+
          2. 第二步:选择framework -> add
            
            

          在再次运行项目,点击屏幕打印出 30

          注意: 项目中如果使用了自制的动态库,在Xcode6之前不能被上传到.AppStore,Xcode6以后可以上传AppStore

    2. 使用framework也可以是静态库的形式,

    3. 只需要简单修改 target -> Bulid Setting-> Mach-O Type -> Statuc Library
      
      
      1. 测试framework的静态库,只需要把framework文件拖入到项目中即可!
    4. 其实可以framework理解为是.a 文件与.h文件的合体,所以在使用上framework比.a文件更加方便,现在很多第三方框架使用的都是framework的形式.

    5. 带有资源的framework与可测试的framework与静态库相同,此处不再赘述.
  • 相关阅读:
    2017/08/02 工作日志
    2017/08/01 工作日志
    http随笔
    window open() 方法
    asp.net中gridview控件的一些基本使用方法
    《java.util.concurrent 包源码阅读》04 ConcurrentMap
    《java.util.concurrent 包源码阅读》03 锁
    《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包
    __stdcall 与 __cdecl
    iebugs产生的原因,zoom:1的作用
  • 原文地址:https://www.cnblogs.com/YRFios/p/4963475.html
Copyright © 2011-2022 走看看