zoukankan      html  css  js  c++  java
  • 制作第三方SDK静态库、.framework(修正)

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

    • 静态库: .a 和 .framework
    • 动态库: .dylib 和 .framework

    静态库和动态库的使用区别:

    • 静态库:链接时,静态库会被完整地复制 到 可执行文件中, 缺点: 【被多次使用,就有多份冗余拷贝
    • 动态库:链接时不复制,程序运行时由系统动态加载到内存里,供程序调用,系统只加载一次!多个程序共享资源,节约内存!

    注意:项目中如果使用了自制的动态库,不能被上传到AppStore, 除非你越狱了。

    -

    区别:.a 静态库 和 .framework

    共同点: 最终都是 转化为 二进制文件 + .h 文件 + 其它文件,才能使用。

    • 1、 .a 和 .framework 的使用区别
    • 2、 .a 本身是一个二进制文件,需要配上 .h 和其它资源文件才能使用。
    • 3、.framework 本身已经包含了 .h 和其它资源文件。说白了就是它包含了所有东西。
      -

    • 为什么要做静态库

    1> 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
    例如:百度地图,友盟,JPush等

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

    02. 静态库的特点

    .a + .h ,.a配合上公共的 .h 文件,我们可以获取到 .a 中暴露的方法或者成员等,你不能控制加载的方式和时机.

    • 在 iOS 8 之前,iOS 只支持以静态库的方式来使用第三方的代码。

    03. 静态库简单演练

    1> 新建XXX项目
    2> 创建一个类方法,实现一个简单的加法
    3> 编译

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

    4> 新建项目将编译生成的.a + .h拖到项目中使用

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

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

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

    1> 建立bundle,并且向其中添加图片
    2> 创建一个类方法,返回图片
    3> 编译
    4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle

    1、创建工程


    1、创建工程

    2、导入已经创建好文件(这里使用的是MJ大神的框架,记得14年,那时他才刚开始写这个库,现在已经超5K 颗心了,挺牛的哈!)


    一个有.h和.m的文件


    -

    3、按步骤演示:


    如图所示

    4、多了一个头文件


    头文件

    5、紧接着是,暴露头文件, .h 文件


    暴露头文件

    5.默认是Project ,你把它拖到Public 就可以了!


    移到到public

    这里要注意了:静态库分真机和 模拟版本的,请看:


    真机和模拟器

    6、真机制作,很简单:


    制作真机

    之前,Products 是红色的,现在经过 第6 步之后就为 黑色的了:


    红色
    • 变黑色:

    黑色
    • 选择点击,右击--》Show in Finder 进去看看:

    真机的情况
    6.1 同理,模拟的步骤也一样,这里就不说了。

    模拟器和真机
    6.2 把公共的文件合并。

    合并
    6、3使用命令行:

    命令行
    • 然后,紧接着输入: open ./

    检查是否存在合成的.a文件

    7、到此,我们要测试该库了

    • 7.1 我们新建一个新项目测试一下:
    • 1、我们新建一个新项目 TestMJExtention
    • 2、在桌面新建一个例如:MJExtention 的文件夹
    • 3、把 合并好的libMyExtentsion.a 和 .h 头文件 拖到 MJExtention 的文件夹 里
    • 4、最后,把 MJExtention 的文件夹拖到工程里,就可以了。
    • 看图:

    以上的小步骤
    • 导入 MJExtention.h 然后调用相应地方法,就可以了。
      -

      注意:解决静态库包含的分类问题。


    解决分类

    好,上面是不包含别人的框架的。现在是,我的静态库,要包含第三方的库。打个比方,我现在是A公司,我A公司的SDK要包含 QQ的库或框架。那该怎么实现呢?

    • 1、首先 我们下载MJRefresh,然后把它的库拖进我们的工程就可以了。当是要注意!!bundle 是不能够导进去的。编译不通过,所以,我们在拖 MJRefresh 库时要忽略 那库。等到合并完毕后,桌面新建文件夹时或直接在工程了新建文件夹,把 bundle 和 合并的.a 一起拖到 文件夹就OK了。
      看图:


      使用MJRefresh框架
    • 其实下面的步骤和上面的基本一样:

    • 1、创建一个工程 TestMJFresh,记得是 库工程啊!库工程啊!库工程啊 ,看图:

    创建新工程
    2、在桌面新建一个文件夹,这里我命名为:MJFile

    把MJRefresh库添加到MJFile里
    • 3、 导入工程

    导入工程
    • 4、操作和之前一模一样了,就是 导入想要的 .h 文件到 Public, 然后通过命令行合并,最后,新建工程测试咯!

    05. 静态库中的自定义视图

    问题:程序需要测试
    静态库如何测试呢?

    创建复合项目

    1> 复习块代码传值

    06. 静态库的使用

    新建项目将编译生成的.a + .h拖到项目中使用

    07. 静态库的种类

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

    调试版本 VS 发布版本

    • 调试版本会包含完整的符号信息,以方便调试
    • 调试版本不会对代码进行优化

    • 发布版本不会包含完整的符号信息

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

    • 静态库的合并

    检测.a的类型

    $ lipo -info libCZTools.a

    合并.a

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

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

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

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

     
     
  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/tig666666/p/5709658.html
Copyright © 2011-2022 走看看