一、静态库与动态库存在的形式
1、静态库:.a 或者 .framework
2、动态库:.tbd(Xcode 7以后.dylib变成.tbd) 或者.framework (顺便提一下,如果使用了动态库,上架会被拒绝)
二、静态库和动态库的区别
1、静态库 :链接时,静态库被完整地复制到可执行文件中,被多次使用就有多次冗余拷贝 例如:多个程序都用到了百度地图的静态库那就被多次拷贝
2、动态库:链接时不复制,程序运行时由系统动态地加载到内存中,由程序调用,系统只加载一次,多个程序共用,节省内存 例如:多个程序都用到了UIKit,那多个程序就共用一个动态库
三、制做静态库
1.创建一个静态库(笔者创建的是.a的静态库)
2.编写静态库,如:
3、如果想使用静态库必须将一些.h的头文件暴露出来供自己或者别人使用,下面是添加需要暴露出来的头文件的方法:
3、然后你就可以选择哪些文件需要暴露出来
4、选择模拟器如iPhone 6s编译 或者选择真机(也可以选择Generic iOS device)编译,这个时候就会出现模拟器编译出来的.a静态库和真机编译出来的静态库。 这个时候,你可以在左边的目录中选择.a静态库,右击 show in finder 就可以查看静态库所在的位置了,如图:
四、使用静态库
1.现在我将模拟器编译出来的静态库拖到新建的一个工程中使用,注意是模拟器编译出来的静态库,使用静态库的结果如图:
可以看到,我们确实是可以使用模拟器编译出来的静态库了。这个时候,我们来试试,
真机编译出来的静态库在模拟器上来使用,下面是运行的结果,如图:
这个时候,出现了一个 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 合并两个静态库,下面是在终端上演示的截图,如图:
七、边制作静态库边调试
按照前面我们所讲的方式创建的静态库在Xcode上是不能运行调试的,如果我们想边制作静态库边调试的话,可以采用下面的这种方式,如图: