有什么不明白的地方,扫描右方二维码加我微信交流。
       

.a文件与.framework的区别

  • .a是纯二进制文件  .framework中除了有二进制文件之外还有资源文件
  • .a文件不能直接使用,至少还有.h文件配合,.framework文件可以直接使用,因为本身包含了.h文件和其他文件
  • .a +.h +source =  .framework

建议使用静态库framework,关于framework的静态库动态库区别,在文章最后。

制作framework流程:

  1. 创建framework工程;
  2. 编写代码;
  3. 修改配置;
  4. 打包;
  5. 测试。

创建framework工程

编写代码

  1. 编写功能代码;
  2. 在创建工程时默认生成的.h文件中添加想要暴露接口的.h文件;
  3. 在Build Phases的Headers中配置,想要暴露接口的.h文件放到public,其他放到project或者private。

修改配置

修改以下几项配置:

如果不需要debug,则直接run出release版本:

 

修改支持arm,添加armv7s和arm64e,并把Build Active Architecture Only该为No:

解释一下这几项目是什么意思:

  • Architectures:生成的版本包括的arm指令的版本,standard包括armv7和arm64;
  • Build Active Architecture Only是针对当前连接的真机arm版本,如果选Yes,则run的时候只会打出当前连接真机arm版本的framework;
  • Valid Architectures指该工程支持的arm版本;

最终打出的版本支持的arm版本是Architectures和Valid Architectures的交集。

 

Dead Code Stripping(没有用到的代码最终会被删掉)

打包

选择模拟器,打一次包;再选择Generic iOS Deivce打一次包

在目录里找到两个包,如下图:

模拟器里生成的framework只支持模拟器,真机包里生成的framework只支持真机,使用以下命令查看framework支持的arm版本,如下:

lipo -info targetFile

 

 

使用以下命令将两个文件合成一个文件,替换真机里的文件,则得到了最终的framework,如下:

lipo -create targetFileA targetFileB -output finalFile

生成完毕之后,查看finalFile支持的arm版本:

测试

使用单元测试或者直接放入工程中引用,测试。

 

 

 

framework分静态库和动态库,那么有什么区别呢?如何去做选择?

  • 动态库:动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
  • 静态库:静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的。

以上是我在网上查到的解释,通俗点说,动态库就是多个App之间共享使用,例如一个工具类App和游戏类App都使用了系统动态库UIKit.framework,当两个App打包时,不会真的将UIKit.framework打包进去,而只是存一份引用。当在手机上运行两个App时,都是从系统同拿动态库。

静态库只能单独某个App使用,如果多个App使用同一个静态库,则两个App打包时各打一份。

如何实现两个App共享使用自定义的一个动态库?我感觉实现不了。

iOS8之前,苹果不允许使用自定义动态库,之后允许了。App Extention可能可以实现两个App共享使用一个动态库,即插件和主程序使用同一份动态库。具体的细节,还请自行研究。

 

 

 

以下内容转自网络:

什么是库 ?

库就是程序代码的集合,将N个文件组织起来,是共享程序代码的一种方式。库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

  • iOS开发中静态库和动态库区别:

静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态库 好处

  1. 模块化,分工合作,提高了代码的复用及核心技术的保密程度
  2. 避免少量改动经常导致大量的重复编译连接
  3. 也可以重用,注意不是共享使用

动态库 好处:

  1. 使用动态库,可以将最终可执行文件体积缩小,将整个应用程序分模块,团队合作,进行分工,影响比较小
  2. 使用动态库,多个应用程序共享内存中得同一份库文件,节省资源
  3. 使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
  4. 应用插件化
  5. 软件版本实时模块升级
  6. 在其它大部分平台上,动态库都可以用于不同应用间共享, 共享可执行文件,这就大大节省了内存。
    iOS平台 在 iOS8 之前,苹果不允许第三方框架使用动态方式加载,从 iOS8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。虽然同样是动态框架,但是和系统 framework 不同,app 中使用 Cocoa Touch Framework 制作的动态库 在打包和提交 app 时会被放到 app main bundle 的根目录 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。不过 iOS8 上开放了 App Extension 功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。
    苹果系统专属的framework 是共享的(如UIKit), 但是我们自己使用 Cocoa Touch Framework 制作的动态库是放到 app bundle 中,运行在沙盒中的
  • 静态库和动态库的存在的形式
  1. 静态库:以.a 和 .framework为文件后缀名。
  2. 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。(系统直接提供给我们的framework都是动态库!)理解.a是一个纯二进制文件.framework中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式
  • 静态库和动态库的区别   

不同点

  1. 静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
  2. 动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;

共同点:

  1. 静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注