• 制作第三方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时一定注意版本

     
     
  • 相关阅读:
    内存的静态分配和动态分配
    C#中堆和栈的区别分析
    NHibernate中的API
    我心中的核心组件(可插拔的AOP)~大话开篇及目录
    简单ORM工具的设计和编写,自己项目中曾经用过的
    NHibernate.3.0.Cookbook第一章第六节Handling versioning and concurrency的翻译
    NHibernate.3.0.Cookbook第一章第五节Setting up a base entity class
    [NHibernate] Guid 作主键速度超慢的背后
    技术分析淘宝的超卖宝贝
    日志打屏对性能有多少影响
  • 原文地址:https://www.cnblogs.com/tig666666/p/5709658.html
Copyright © 2020-2023  润新知