• 【iOS开发之静态库、动态库】


    什么是库?

    库 就是程序代码的集合, 是共享程序代码的一种方式,库一般分两类:开源库和闭源库。github中共享一般是开源库;闭源库分为:静态库和动态库,闭源库不开放源代码,是经过编译的二进制文件,一般用于保护不开源的核心代码。

    还可以将MRC的代码打包成静态库,运行在ARC的环境下。

    静态库

    静态库一般以.a和.framework结尾,静态库在链接时, 会被完整的复制到可执行文件中; 被多次使用, 就有多份拷贝;

    静态库一般用于保护自己核心代码,国内的企业,掌握核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用,如支付宝,百度地图等

    静态库一般是.h和.a来结合使用,.h来暴露方法名供用户使用,.a来屏蔽具体实现。

    静态库的制作

    制作.a的静态库

    1、打开xcode,如下图创建静态库项目。

    2.设置编译静态库适用所有架构的模拟器,Build Settings -> Build Active -> NO,设置后编译生成的库使用所有模拟器。

    3.选取要暴露出去的头文件,在target->Build Phases->Copy Files将要暴露的头文件加进来

    4.选择模拟器(此处可随意选择,因为第2步已经设为NO,可适用于任何模拟器),然后编译项目,编译完成后左下角的.a文件由红色变为白色,即表示已经生成了静态库。如果是要在真机上使用,就要选择真机进行编译。

    5.右击.a文件选择"show file in finder",在finder中找到.a文件(此处有连个文件夹,一个是simulator用于模拟器,一个是iphoneos用于真机)。include中是第3步设置的头文件,需要用时将此处.a文件和include中的.h文件拷贝到要使用静态库的项目中即可使用。

    6.一般默认情况下,编译出来的都是在debug模式下使用的库,如果想制作发布阶段使用的库,可以选择edit schema->run->biuld configuration中的release版本,再编译项目,即可生成release版本的静态库。(release版本的静态库比debug的静态库略小,并去掉了很多调试用的字符)

     

    制作.framwork的静态库

    1.新建项目选.framwork的库

    2.设置编译所有架构的库

    3.设置要暴露的头文件(此处和.a不同),要将project栏目的头文件拖动至pubic栏目中,表示该文件可以共用。

    4.最后一步,设置编译后的库是静态的,target -> Build Settings-> 搜索 Mach-o Type改为静态库。如果不设置此项默认将生成动态库。

    5.使用时只需要将.framework赋值到项目中即可。

     .a的静态库和.framwork的区别:

    1> .a是一个纯二进制文件,  .framework中除了有二进制文件之外还有资源文件

    2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用

    3> .a + .h + sourceFile = .framework

    4>  建议使用.framework

    注意点:

    1.如果在制作静态库时,需要添加很多图片素材,此时为了防止图片资源和使用者项目中的图片资源同名等冲突,可以在库中创建一个.bundle的资源包,将图片放入到这个包中。

    2.暴露头文件过多时,可以写一个主头文件,将其他头文件都加入到主头文件,再将主头文件暴露出来。

    3.在静态库制作时,想调试静态库,但又由于静态库不是正在的可运行的工程,所以没法调试。这是可以新建一个标准的ios工程,然后在该工程中再添加一个静态库工程,并将静态库添加到标准工程中,添加依赖即可调试。

    动态库

    动态库一般以.dylib和.framework结尾,动态库则不会复制, 只有一份. 程序运行时动态加载到内存; 系统只加载一次, 多个程序共用, 节省内存; 但是项目中如果使用到自己的动态库, 不允许上架!

    制作步骤同静态库生成.framework一致,只是不需要第4步。

    使用时需要在Embedded Binaries中添加导入的库才能使用

    常见的报错和处理办法:

    参考这篇文章

    https://my.oschina.net/ioslighter/blog/363211

  • 相关阅读:
    html5 -- data-* 自定义属性
    javascript -- canvas绘制曲线
    php -- 取整数
    vim 常用命令
    Html Meta 标签详解
    基于行块分布函数的正文抽取
    机器学习公开课~~~~mooc
    快速排序
    mapreduce (三) MapReduce实现倒排索引(二)
    temp gbk2utf8
  • 原文地址:https://www.cnblogs.com/heyode/p/5223040.html
Copyright © 2020-2023  润新知