ios开发拓展篇一静态库

 ios开发拓展篇一静态库 

一 , 简单介绍

1,什么是库?

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

2.库的分类

      根据源代码的公开情况,库可以分为2种类型

        (1) 开源库  

           公开源代码,能看到具体实现

    比如SDWebImage、AFNetworking等第三方框架

        (2) 闭源库

              不公开源代码,是经过编译后的二进制文件,看不到具体实现

               主要分为:静态库, 动态库

 

二 , 静态库和动态库

1.静态库和动态库的存在形式

        静态库:.a 和 .framework

        动态库:.dylib 和 .framework

 

2.静态库和动态库在使用上的区别

        静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(图1所示)

         动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(图2所示)

         图1

                        

       图2

                          

           

    需要注意的是:项目中如果使用了自制的动态库,不能被上传到AppStore

     

三 , 静态库的应用场景 (一)

      百度地图想开发者在应用程序中集成百度地图
       但是百度不想公布自己的技术实现,如何完成呢?
       百度将自己的核心代码编译成静态库
       对外暴露统一的接口
       开发者集成静态库,并且调用静态库即可集成
 
     静态库的应用场景 (二)
 
        公司项目开发有一部分代码为核心代码
        如果任何人都可以拿到核心代码,那么一旦有人离职,公司核心代码就会一起被拿到.如何防止这种情况呢?
        公司抽出一部分核心团队成员,专门开发这部分核心代码
         开发后,将核心代码编译成静态库给其他程序员调用
         成员很少会离职,非核心成员离职无法带走核心代码
 
四 , 制作.a静态库
(1)创建项目,选择Framework&Library-->Static Library(选择第一个)
                   
(2)创建好之后,编写核心代码
(3)编译(command +b)静态库之前,选择需要暴露的.h文件,.m文件会自动编译到.a文件中
 
(4)选择真机设备编译,libMathTool.a文件从红色变成黑色
 
(5)再选择模拟器编译
 
(6)在finder中显示,查找制作好的.a文件
 
说明:

       Debug-iphoneos文件夹里面的东西是用在真机上的

       Debug-iphonesimulator文件夹里面的东西是用在模拟器上的

(7)创建一个项目,测试使用静态库即可

 

五 , 静态库的架构问题

  •         设备的CPU架构
    • 不同的设备使用的CPU是不同的
    • CPU的不同造成使用的CPU架构(指令集)不同
  • 静态库有其支持的CPU架构
    • 如果静态库在不支持的CPU架构上运行就会报错
  • 模拟器使用的CPU架构
    • iPhone4s-iPhone5 : i386
    • iPhone5s-iPhone6plus : x86_64
  • 真机使用的CPU架构
    • iPhone3gs-iPhone4s : armv7
    • iPhone5-iPhone5c : armv7s
    • iPhone5s-iPhone6plus : arm64
    • 唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行
  • 查看静态库支持的架构
    • lipo -info 静态库
  • 合并静态库
    • lipo -create 静态库1 静态库2 -output 合并的静态库

六 , 编译.framework静态库

 (1) 建项目时,选择Framework&Library-->Frameword

(2)默认创建的项目中有一个主头文件,可以将其他头文件在该头文件中import一下

(3)编写核心代码

(4)编译前,将头文件暴露出去

(5)默认情况直接编译的库位动态库,可以修改配置改成静态库

(6)选择模拟器和真机分别编译

(7)打开Products即可看到.framework库

(8),把编译好的静态库拿去用就是了

 

七 , .a 和 .framework 的使用区别

    .a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用

  .framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

 

八 , 开发调试静态库

          如果希望一遍开发一遍调试静态库,可以在项目中直接添加静态库

(1)在项目中,按照下面步骤即可

       .点击项目-->左下角+

(2)选择希望开发的静态库类型(.a/.framework)

(3)创建静态库后,即可看到静态库文件
(4)使用静态库
使用静态库前需要进行配置

(5)测试之后,按照之前步骤打包成静态库即可

 

九 , 补充

(1)为什么要做静态库

1>  国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用

例如:百度地图,友盟,JPush等

2>  在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用

(2)静态库中资源包的使用

问题:有些第三方库会使用到一些图片素材,例如公司的logo等。

          但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。

在静态库中如果要使用图片素材,会利用bundle的手段

          1>  建立bundle,并且向其中添加图片

          2>  创建一个类方法,返回图片

          3>  编译

          4>  调用方如果需要使用,需要导入 .h + .a + XXX.bundle

 

(3)多文件处理

  如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)

  在主头文件中包含所有其他需要暴露出来的 .h 文件

  使用静态库时,只需要#import 主头文件

  实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>

 (4)静态库的合并

     # 检测.a的类型

     $ lipo -info libCZTools.a

   # 合并.a

        lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

      # 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试

      # 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的

     # 今后在使用.a时一定注意版本

 

posted @ 2015-12-09 19:12  Hlc_牧马人  阅读(169)  评论(0)    收藏  举报