iOS静态库的封装

1,283 阅读3分钟

静态库和动态库区别:

  • 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
  • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

.a与.framework有什么区别

  • .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
  • .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用,建议用.framework。
.a + .h + sourceFile = .framework。

.a静态库的制作

我们直接创建调试项目,一般不直接创建静态库。因为需要打断点,等调试成功后再打包相应的静态库。

1.创建一个普通项目

创建项目,并且在项目中添加 static library,最终如下图所示。

2.设置可见的.h文件。

Build Phases --> Copy Files 添加.h文件即可。

3.修改支持的架构

设置支持所有模拟器架构 Build Settings --> Build Active Architecture Only --> Debug 改为 NO,设置支持所有手机架构。

4.然后编译

选中PrintTarget,然后分别选择Generic iOS Device任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的libPrint.a由红色变成了黑色,然后show in finder,看看生成的文件。

5.将模拟器和真机的静态库合并

  • 可以使用lipo-info + 静态库名字命令查看静态库支持的框架。
  • 如果想要让模拟器和真机通用一个静态库,我们可以使用终端命令来实现。命令格式:lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径

.framework静态库的制作

1.创建一个普通项目

2.修改打包的framework是动态库还是静态库

framework项目默认是动态库。 静态库配置:Build Settings --> Mach-O Type --> 改为 Static Library。 设置支持所有模拟器架构 Build Settings --> Build Active Architecture Only --> Debug 改为 NO,设置支持所有手机架构。

3.编写代码,设置可见头文件

编写完代码后,Build Phases --> Headers --> public 添加头文件。

4.然后编译

选中LibTestTarget,然后分别选择Generic iOS Device任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的LibTest.framework由红色变成了黑色,然后show in finder,看看生成的文件。

5.将模拟器和真机的静态库合并

  • 可以使用lipo -info framework下的二进制文件名字命令查看静态库支持的框架。
  • 如果想要让模拟器和真机通用一个静态库,我们可以使用终端命令来实现。合并的命令为: lipo -create 第一个framework下二进制文件的绝对路径 第二个framework下二进制文件的绝对路径 -output 最终的二进制文件路径

6.注意

注意: 如果静态库中有category类,则在使用静态库的项目配置中Other Linker Flags需要添加参数-ObjC或者-all_load

完整Demo地址

github: github.com/CaoXueLiang…