美文网首页不明觉厉iOSiOS-Developer-OC
iOS - 从头开始封装 .a静态库

iOS - 从头开始封装 .a静态库

作者: SunshineAutumn | 来源:发表于2017-02-27 11:09 被阅读926次

    库的作用:

    库是程序代码的封装集合,主要用于代码共享和重用。

    库的分类:

    • 根据代码是否公开的需求,库分为两类:开源库和闭源库。
      现在网络上经常使用的开源库有:SDWebImage、AFNetWorking等。
    • 开源库和闭源库的区别在于,开源库能看到代码的具体实现,而闭源库是代码经过编译后的二进制文件,使用者看不到代码逻辑的具体实现。

    闭源库的又分为静态库和动态库,使用区别是:

    • 静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。如下图所示:
    1112684-e597bfd02e25d1f4.png
    • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。
    1112684-575a9125c1100f1d.png

    在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。

    1.之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库。
    2.二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。
    3..a和.framework两种静态库,通常都是把需要用的到图片或者xib文件存放在一个bundle文件中,而该bundle文件的名字和.a或.framework的名字相同。

    .a封装步骤

    1.创建项目,选择 'Framework&Library'下的'Cocoa Touch Static Library'

    屏幕快照 2017-02-27 上午10.01.57.png

    2.创建项目时填写自己想要创建的静态库名称,然后打开项目,项目最上边的小房子表示的就是静态库,注意:项目刚创建时Product文件夹下的.a文件显示红色,如图所示(frist是随便取的):

    屏幕快照 2017-02-27 上午10.10.18.png

    3.然后将自己想要打包的项目文件拖到项目中,这里不做大型项目封装,所以简单写两个文件打包到.a文件中,如下图所示:

    屏幕快照 2017-02-27 上午10.22.00.png

    注意:一般情况下,楼主这里first文件的都是直接删除的,但是为了让大家看到创建项目时是文件创建的,所以这里只删除了.m文件,后期.h文件未使用。
    4.封装.a,暴露接口,我们只需要选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中。选中Target-build Phases 添加需要暴露的头文件


    屏幕快照 2017-02-27 上午10.37.28.png
    屏幕快照 2017-02-27 上午10.37.35.png 屏幕快照 2017-02-27 上午10.37.42.png

    将需要公开的头文件导入到Headers 下边的 Public下,如图:

    屏幕快照 2017-02-27 上午10.41.06.png

    5.设置完成,开始编译,因为模拟器和真机环境下编译的.a文件是分开的,所以我们这里编译两次。
    模拟器编译如图所示:

    屏幕快照 2017-02-27 上午10.49.05.png

    编译完成后,.a文件会由红色变成黑色,真机也是如此(楼主的数据线王带了,以后补上😅)

    5.真机,模拟器都运行后,会生成两个.a文件

    屏幕快照 2017-02-27 上午10.52.09.png

    这里是真机和模拟器的两个文件夹:


    屏幕快照 2017-02-27 上午10.52.37.png 屏幕快照 2017-02-27 上午10.53.02.png

    6.如果想要一个可以同时在真机和模拟器上都可以运行的.a文件的话,通过终端合并模拟器下的.a文件和真机下的.a文件(因为楼主只有一个文件,楼主就不放图了,以后想的起来的话就补上😂)
    lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
    解释:lipo -create 真机下.a的路径 模拟器下的.a文件路径 -output 一个新的需要保存的路径
    使用时,使用新生成的.a文件加上暴露出来的.h文件使用


    屏幕快照 2017-02-27 上午11.00.40.png

    7.将.a文件和.h文件放到新创建的工程中,引入头文件即可使用

    屏幕快照 2017-02-27 上午11.07.12.png
    • 注意:.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用 ;.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用。
    • 静态库使用的必要性
    1. 代码的共享与重用
    2. 程序模块化
    3. 分享给别人代码库时代码隐藏
    4. 开发第三方SDK

    相关文章

      网友评论

      本文标题:iOS - 从头开始封装 .a静态库

      本文链接:https://www.haomeiwen.com/subject/tcuwwttx.html