iOS 静态库与动态库(制作和使用及其本质)

一、静态库与动态库存在的形式

1、静态库:.a  或者 .framework

2、动态库:.tbd(Xcode 7以后.dylib变成.tbd) 或者.framework (顺便提一下,如果使用了动态库,上架会被拒绝)

二、静态库和动态库的区别

1、静态库 :链接时,静态库被完整地复制到可执行文件中,被多次使用就有多次冗余拷贝 例如:多个程序都用到了百度地图的静态库那就被多次拷贝

2、动态库:链接时不复制,程序运行时由系统动态地加载到内存中,由程序调用,系统只加载一次,多个程序共用,节省内存  例如:多个程序都用到了UIKit,那多个程序就共用一个动态库

三、制做静态库

1.创建一个静态库(笔者创建的是.a的静态库)

iOS 静态库与动态库(制作和使用及其本质)_第1张图片
制作静态库

2.编写静态库,如:

iOS 静态库与动态库(制作和使用及其本质)_第2张图片
编写代码

3、如果想使用静态库必须将一些.h的头文件暴露出来供自己或者别人使用,下面是添加需要暴露出来的头文件的方法:

iOS 静态库与动态库(制作和使用及其本质)_第3张图片
添加需要暴露出来的头文件

3、然后你就可以选择哪些文件需要暴露出来

4、选择模拟器如iPhone 6s编译 或者选择真机(也可以选择Generic iOS device)编译,这个时候就会出现模拟器编译出来的.a静态库和真机编译出来的静态库。 这个时候,你可以在左边的目录中选择.a静态库,右击 show in finder 就可以查看静态库所在的位置了,如图:

iOS 静态库与动态库(制作和使用及其本质)_第4张图片
查看静态库和暴露出来的头文件

四、使用静态库

1.现在我将模拟器编译出来的静态库拖到新建的一个工程中使用,注意是模拟器编译出来的静态库,使用静态库的结果如图:

iOS 静态库与动态库(制作和使用及其本质)_第5张图片
模拟器编译出来的包在模拟器上运行的结果

可以看到,我们确实是可以使用模拟器编译出来的静态库了。这个时候,我们来试试,

真机编译出来的静态库在模拟器上来使用,下面是运行的结果,如图:

iOS 静态库与动态库(制作和使用及其本质)_第6张图片
真机编译出来的静态库在模拟器上使用的结果

这个时候,出现了一个 not fount for architecture x86_64 这样的错误。下面我们来讲讲为什么会出现这样的情况,怎么解决这样的情况

五、剖析静态库

1、不同的设备使用的CPU是不同的,CPU的不同照成使用的CPU架构(指令集)不同;静态库有其支持的CPU架构,如果静态库在不支持的CPU架构上运行就会报错。

模拟器使用的CPU架构: iPhone4s - iPhone 5: i386  iPhone5s - iPhone7plus :x86_64

真机使用的CPU架构: iPhone3GS - iPhone4s :armv7   iPhone5-iPhone5c:armv7s  iPhone5s- iPhone 7:arm64  (只要支持了armv7的静态库可以在arm64上正常运行)

2、也就是说,我们选择了模拟器的时候编译出来的静态库在真机上是不能使用的,同理,真机编译出来的静态库是不能在模拟器上使用的。这就可以知道我们上面报错的原因了,同样我们也可以解决错误了

六、使用终端命令查看静态库和合并两个静态库

1、使用命令:lipo -info 可以查看对应的静态库所支持的架构

2.、如果我们想静态库同时支持模拟器和真机上使用的话,我们可以将模拟器编译出来的静态库和真机编译出来的静态库合并,这样的话,就可以同时支持真机和模拟器了。使用命令 lipo -create    静态库1 静态库2 -output 合并两个静态库,下面是在终端上演示的截图,如图:

iOS 静态库与动态库(制作和使用及其本质)_第7张图片
使用终端查看静态库支持的架构和合并两个静态库

七、边制作静态库边调试

按照前面我们所讲的方式创建的静态库在Xcode上是不能运行调试的,如果我们想边制作静态库边调试的话,可以采用下面的这种方式,如图:

iOS 静态库与动态库(制作和使用及其本质)_第8张图片
边制作静态库边调试

你可能感兴趣的:(iOS 静态库与动态库(制作和使用及其本质))