先补充一下静态库和动态库的知识。这部份内容我也不太熟,没有开发经验,若有错误欢迎打脸。html
静态库的代码追加到可执行文件内,被屡次使⽤用就有多份冗余拷⻉。ios
好处就是应用程序包自身能够独立运行,而很差的地方就是包会略显臃肿,库不能共享。git
iOS 中静态库的形式是 .a 和 .framework (本身建立的 .framework 是静态库)。github
.a 文件在真正使用的时候须要提供头文件和资源文件。之前 Xcode 中默认提供的就是这种方式。不过编译出来静态库只支持特定的一种硬件架构体系,若是你想生成一个 Universal 的静态库的话,须要经过工具来将多个静态库进行合并。并且使用的时候须要另外配合 .h 文件,相比之下 framework 会是更好的选择。objective-c
framework 不但能够包含二进制文件,还能够包含头文件,资源文件等,甚至能够支持多个版本。不过各个应用所使用的本身的公用库,最终都须要 link 进可执行文件,因此本质上仍是一个静态库。swift
动态库的代码和可执行文件是分开独立的,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用节省内存。xcode
动态库的优劣与静态库相反,动态连接库须要库环境,但因为自己不集成库内容,会比较小,同时也为和其余应用共享库的使用提供了可能。安全
iOS 中动态库的形式是 .dylib 和 .framework (系统的 .framework 是动态库)。架构
出于安全层面的考虑, AppStore 不容许使用第三方的动态连接库。咱们能够经过 framework 编写本身的公用库。随着 Xcode6 开始支持新建 framework ,不再用手动配置了。iOS-Universal-Framework 也宣布中止更新。app
模块化 (modules) 是在 2012年的 LLVM Developers Meeting 中提出的。简单说就是用树形的结构化描述来取代以往的平坦式 #include
,对框架进行封装,从而解决以往方法的脆弱性和扩展性不足的问题。 (这段我也不太懂,只是翻译了一下。。。)
以 UIKit 为例, module.map
大概是这个样子:
framework module UIKit { umbrella header "UIKit.h" module * {export *} link framework "UIKit" }
使用的时候用 @import
便可。若是全部代码都须要这样重写一定是一项浩大的工程,因此 Apple 已经提早把这部分工做作好了。只要使用的是 iOS7 的 SDK,将 Enable Modules 打开后,而后保持原来的 #import
写法就好了,编译器会在编译的时候自动地把可能的地方换成 modules 的写法去编译。
写到这里,我忽然忘了我原本想些什么的了。。。走了太远,忘了当初为何出发了擦。
那就这样吧。