ios中静态库和动态库的使用

来源:互联网 发布:百度人工智能上海招聘 编辑:程序博客网 时间:2024/06/05 20:18
一、库的简介
库:是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种:
1、开源库:公开源代码,可以看到具体的实现.SDWebImage、AFNetWorking
2、闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体的实现.它主要分为:静态库、动态库

 
2.1、静态库的存在形式是:
.a或者.framework;
静态库在链接的时候会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝(即不同app之间都需要独立导入,在ios系统中会有多份),实际开发中都是静态库,如百度地图等
静态库应用场景:
场景一:百度地图核心代码 --> 编译成静态库 --> 对外暴露统一接口 --> 开发者集成静态库,调用
场景二:公司内部核心成员编写一份核心代码 --> 编译成静态库 --> 给其它成员使用 --> 避免核心代码泄漏

保护公司的核心代码

在MRC项目中打包成静态库,可以在ARC下直接使用不需要转换 


2.2、动态库的存在形式是:

dylib或者.framework:

如系统的框架都是动态库

动态库链接的时候不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。项目中如果使用了自制的动态库,不能被上传到AppStroe上,因此动态库是不会被使用的。

ios8.0中开放了动态加载的dylib的接口,动态库的挂载。


二、静态库的使用

主要包括:.a和.h文件

1、创建.a的静态库

1.1、创建工程时选择工程类型


1.2、创建普通的类,来封装方法

@interface Tool : NSObject+ (void)testRun;@end@implementation Tool+ (void)testRun{    NSLog(@"测试静态库的接口方法");}@end

1.3、编译工程即可生成静态库文件,注:在iphone 6模拟器下进行编译


1.4、暴露静态库的.h文件,让外部通过接口访问




1.5、创建新工程,导入“.a和.h”文件使用静态库

commend + shift + n:创建一个新工程





2、静态库的架构

设备的CPU架构:不同的设备使用的CPU是不同的,CPU不同造成使用的CPU架构(指令集)不同
    每个静态库有其支持的CPU架构,如果静态库在不支持的CPU架构上运行就会报错。模拟器和CPU的架构是不同的。
    
模拟器使用的CPU架构;
iPhone4s-iPhone5 : i386
iPhone5s-iPhone7plus 、iPhone SE: x86_64


真机使用的CPU架构:
iPhone3gs-iPhone4s : armv7
iPhone5-iPhone5c : armv7s
iPhone5s-iPhone6plus : arm64


唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行

在创建静态库时,一般通过多Targets方式边开发边调试静态库


2.1、查看静态库文件支持的CPU架构


lipo -info 静态库名字



2.2、合成静态库文件的架构


2.2.1、合成模拟器所需要的全部架构

分别编译x86_64、i386静态库架构



把编译好的文件移到同一个文件夹下,然后再合并





注:如果把debug设置为NO,则编译出来的静态库文件直接支持所有的模拟器架构或者真机的所有架构



2.2.2、合成支持所有真机架构的静态库文件



2.2.3、类似第三方SDK一样生成支持所有真机和模拟器架构的静态库文件




合成arvm7s架构,它在2014年10月份的xcode更新中,已经不支持输出了,如果需要合成,则需要进行如下配置

 



注:合成静态库的问题:如果静态库的包比较大,则不合成支持架构的通用静态库文件,开发时可以采用先合并,发布时使用真机架构的静态库。如果文件体积小,则可以合成通用架构的架构静态库文件。

打包静态库文件是,一些资源文件(图片、等其它)不会合并到.a静态库中,需要自己拿出来,然后放到创建的.bundle文件里面,并把该.bundle文件和.a静态库文件一起导入使用的工程中。

在Xcode 7.0以后会默认包含bitcode,如果导入一些第三方库报错bitcode,则需要把bitcode设置为NO




3、制作.framework静态库

在制作framwork库时,默认是动态库,需要进行如下修改


3.1、创建静态库的核心文件,并设置它编译为.framwork的静态库



.framework静态库文件,也是分架构输出的,方式和上面.a静态库一致。

在使用.framework静态库时,导入时用"<>"


三、动态库的使用

使用自己制作的动态库文件时,需要进行如下配置