049*:什么是动态连接库?静态库?你有没有自己写过静态编译库,遇到了哪些问题?
一:介绍
-
动态库形式:.dylib和.framework
-
静态库形式:.a和.framework
-
动态库和静态库的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(图1所示)
系统动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(图2所示)
二:iOS的动态库(被阉割的动态库)
iOS平台上规定不允许存在动态库,并且所有的 IPA 都需要经过Apple的私钥加密后才能用,基本你用了动态库也会因为签名不对无法加载,(越狱和非 APP store 除外)。于是就把开发者自己开发动态库成为了天方夜谭。
iOS8之前因为 iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码,并且iOS是单进程的,也就是某一时刻只有一个进程在运行,那么你写个共享库,给谁共享呢。同时动态下载代码又是被苹果明令禁止的,没办法发挥出动态库的优势,综上所以上动态库也就没有存在的必要了。
但是后来iOS8之后,iOS有了App Extesion特性,而且Swift也诞生了。由于iOS主App需要和Extension共享代码,Swift语言机制也需要动态库,于是苹果后来提出了Embedded Framework,这种动态库允许APP和APP Extension共享代码,但是这份动态库的生命被限定在一个APP进程内。简单点可以理解为被阉割的动态库。
但是这种动态库(Embedded Framework) 和系统的 UIKit.Framework 还是有很大区别,传统的动态库是给多个进程用的,而这里的动态库(Embedded Framework)是给单个进程里面多个可执行文件用的。系统的 Framework 不需要拷贝到目标程序中,我们自己做出来的 动态库(Embedded Framework) 哪怕是动态的,最后也还是要拷贝到 App 中(App 和 Extension 的 Bundle 是共享的)。所以苹果没有直接把这种Embedded Framework称作动态库而是叫Embedded Framework。
三:本地组件化开发
1. 在workspace中管理多个project的方式实现组件化
- 新建workspace,新建或者添加项目工程Project,比如叫Test
- 新建Project比如叫Common,类型选择framework
- Build Settings -> Mach-O Type 选择dynamic library动态库,选择静态库也可以,看需要
- 将通用模块的代码放在Common中,添加需要的系统库,暴露相应的头文件
- 在项目工程Test中,Build Phases -> Link Binary With Libraries中添加+ Common.framework
- 动态库还需要在General -> Embedded Binaries中添加
- 选择项目工程target,运行即可,自动联编Common.framework
2. 如果还想在项目工程中继续使用#import "",双引号的方式引用Common.framework中的头文件
- 在项目工程中Build Settings -> Header Search Paths中添加 $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Common.framework/Headers
- $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)这个路径是framework生成路径,可以自动识别debug还是release,也可以自行修改,在Common的工程中Build Settings->Per-configuration Build Products Path中查看
四:问题
1:Framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用
2:怎么访问 framework 中的资源文件?
用路径访问:
[NSBundle bundleWithName];
3:主工程中加载framework可能出现弹窗显示位置失常!
组件化开发中用最顶层的Controller来push或者present。
4:在framework中,图片资源不能使用xcassets进行管理!
这是因为framework中的xcassets文件打包之后会变成.cer文件,并不暴露出图片资源,所以framework不能通过xcassets来管理图片资源。
解决办法是:创建一个资源文件夹把全部图片文件都装进去进行管理。