动态库
动态库即动态链接库(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。
iOS FrameWork
在 iOS 8 之前,iOS 平台不支持使用动态 Framework,开发者可以使用的 Framework 只有苹果自家的 UIKit.Framework,Foundation.Framework 等,iOS 8/Xcode 6 推出之后,iOS 平台添加了动态库的支持
创建动态库
打开Xcode,Command+Shift+N创建新工程,选择 Cocoa Touch Framework,语言选择Swift
暴露接口
对于那些需要暴露出来,即在框架外部也能访问使用的类、方便、变量前面需要加上关键字 Public
编译动态库
command+B编译成功,在Products文件下出现XXX.framework文件
使用动态库
如果把某个自己开发的动态库Add在Linked Frameworks and Libraries里,程序一启动就会报Reason: Image Not Found,你只能把它放在Embeded Binaries里面才能正常使用。为什么呢?因为加在EmbededBinaries里面的东西其实会被复制一份到xx.app里面(直译就是嵌入的框架)
存在的问题:在动态库中不能使用静态库
造成这个的主要原因是Swift的运行时库(不等同于OC的runtime概念),由于Swift的ABI不稳定,静态库会导致最终的目标程序中包含重复的运行库,相关可以看下最后的参考文章SwiftInFlux#static-libraries
临时解决办法:动态库中有需要依赖静态库的swift文件/页面,都通过闭包的方式回调到主工程中
CocoaPods使用Use_framework!
对于 Swift 项目,CocoaPods 提供了动态 Framework 的支持,通过 use_frameworks! 选项控制。