Xcode_Static Library & Framework

  • 区别:
  1. 承载的内容范畴:
    (1) Static Library 'stætɪk 的产出物只是一个 .a 文件,为二进制执行文件。分享给别人的时候,头文件、静态资源文件需要另外提供。
    (2) Framework 'freɪm wɜːk 为 一站式分享方案,其实是一个文件夹,其中包含代码签名、头文件、二进制执行文件、静态资源文件等。
    (3) 总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用 .framework 的形式

  2. 头文件搜索路径的区别:StaticLibrary 需要设置头文件搜索路径,Framework 不需要。

  3. 当存在对外部代码库依赖的时候
    (1) StaticLibrary:能够只引用外部库的头文件,调用外部库的公开方法,而不引入其库实现,实现与引用库的分离部署。
    (2) Framework:要引用一个外部库,就必须要将此外部库的实现放入 Framework 内编译才可以。如果要想达到 StaticLibrary的效果,可以使用运行时方式调用。

  4. 运行环境 (对 3 的理解升级)
    (1) StaticLibrary:共享其运行环境,假如其运行环境中包含库中同一个类,会发生代码冲突,必须剥离其中一方的此类,然后共享此类。
    (2) Framework:与其运行环境隔离,假如其运行环境中包换库中同一个类,不会发生冲突,同名的两个类会在各自的环境中独立运行,互不干扰,哪怕是单例类。

  5. 综合 3 和 4,现总结在多方合作开发的时候,负责库实现的人员,如何选择使用 Framework 还是 StaticLibrary
    (1) 假如不想在同一个 App 中包含多份三方库(减小包大小),可以使用 StaticLibrary,库本身和 App 共享第三方库。但是产出物的结构可能会比较乱。
    (2) 假如不想考虑和 App 的代码冲突问题,库本身独立使用需要的库,想提供比较好的库结构,可以使用 Framework。但是假如库本身和 App 都使用了同一个三方库,会存在两份三方库,会增加包大小。



  • 静态库 ( .a文件 ) , 是一系列从源码编译的目标文件的集合,是源码的实现所对应的二进制。配合上公共的 .h 文件,可以获取到 .a 中暴露的方法或者成员变量,在最后编译 app 的时候 .a 将被链接到最终的可执行文件中,之后每次都随着 app 的可执行二进制文件一同加载

  • 在 iOS 8 之前,iOS 只支持以静态库的方式来使用第三方的代码 , 不允许第三方框架使用动态方式加载,

  • 从 iOS 8 开始 允许开发者 有条件地创建和使用动态框架,
    这种框架叫做 Cocoa Touch Framework。
    虽然同样是动态框架,但是和系统 framework 不同,
    苹果系统专属的 framework 是共享的(如UIKit),
    app 中 使用 Cocoa Touch Framework 制作的 动态库,
    在打包 和 提交 app 时会被放到 app main bundle 的根目录中,运行在沙盒里,而不是系统中。
    也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。
    不过 iOS 8 上开放了 App Extension 功能,可以为一个应用创建插件,这样主 app 和 插件之间共享动态库还是可行的。



  • 动态框架 ( Dynamic Framework )
    动态框架是以 .framework 结尾的。Framework 其实是一个 bundle,是一个特殊文件夹,系统的 framework 是存在于系统内部,而不会打包进 app 中,app 启动 的时候会检查所需要的动态框架是否已经加载。像 UIKit 之类的常用系统框架一般已经在内存中,就不需要再次加载,这可以保证 app 启动速度。相对静态库,framework 是自包含的,你不需要关心头文件位置等,使用起来很方便。

  • Library & Framework
    对比 静态库 和 动态框架,后者是有不少优势的
    首先,静态库不能包含像 xib 文件,图片这样的资源文件,其他开发者必须将它们复制到 app 的 main bundle 中才能使用,维护和更新非常困难,而 framework 则可以将资源文件包含在自己的 bundle 中。其次,静态库 必须打包到二进制文件中,你可能需要将同一个 .a 包含在 app 本体以及扩展的二进制文件中。这是不必要的重复
    最后,静态库只能随应用 binary 一起加载 , 而动态框架加载到内存后就不需要再次加载,二次启动速度加快。

你可能感兴趣的:(Xcode_Static Library & Framework)