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来管理图片资源。

解决办法是:创建一个资源文件夹把全部图片文件都装进去进行管理。

是通过路径拼接来访问图片和国际化语言和资源文件plist文件。
5:当flag里面添加了注释却还是无法使用的时候,可能报flag与bitcode冲突的问题尤其是第三方库可能和bitcode冲突),这样的话就需要将bitcode设置为NO!
6:image not found.添加Embed Frameworks这个选项。
 
 
引用:

posted on 2018-07-17 11:04  风zk  阅读(216)  评论(0编辑  收藏  举报

导航