iOS开发过程中经常会用到第三方库,微信支付,支付宝支付,地图,即时通信的库,极大的提升了开发效率,如果公司项目比较大,也可以将常用的业务模块封装成库供内部使用.
基础概念
库作为共享程序的形式,分为静态库和动态库.
静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝.文件后缀名为.a和.frameWork
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 文件后缀名为.dylib和.framework
FrameWork比较特殊可以是静态库也可以是动态库,系统的UIKit.frameWork是动态库,自己建立的或者第三方的.frameWork为静态库.
静态库.a是一个二进制文件,无法直接提供给外界使用,需要提供一个.h文件供外部调用,微信支付的提供了.a和.h文件.
静态库frameWork与.a最大不同的在于,资源文件和.h文件,例如即时通信的库文件一般为.frameWork因为内部需要提供给聊天的默认图片,Gif等资源文件,.frameWork在开发中更常见一些.
iOS8 & Swift
iOS 8 之前不支持动态FrameWork,iOS 8 之后添加了动态库的支持,主要原因是Extension 和 App 作为两个分开的可执行文件,同时需要共享代码,这种情况下动态库的支持就是必不可少的了.但是这种动态 Framework 和系统的 UIKit.Framework 还是有很大区别。系统的 Framework 不需要拷贝到目标程序中,我们自己做出来的 Framework 哪怕是动态的,最后也还是要拷贝到 App 中(App 和 Extension 的 Bundle 是共享的),因此苹果又把这种 Framework 称为 Embedded Framework。
Swift 跟着 iOS8 / Xcode 6 同时发布的,如果要在项目中使用外部的代码,可选的方式只有两种,一种是把代码拷贝到工程中,另一种是用动态 Framework.使用静态库是不支持的.
造成这个问题的原因主要是 Swift 的运行库没有被包含在 iOS 系统中,而是会打包进 App 中(这也是造成 Swift App 体积大的原因),静态库会导致最终的目标程序中包含重复的运行库.同时拷贝 Runtime 这种做法也会导致在纯 ObjC 的项目中使用 Swift 库出现问题。苹果声称等到 Swift 的 Runtime 稳定之后会被加入到系统当中,到时候这个限制就会被去除了.