我们用服务每一个客户

Our intention to service each customer

诚实 守信 专业 专注

iOS开发-你不了解的库(一)

更新时间:2021-02-09 浏览:991
您当前的位置:首页 > 新闻中心 > 软件开发

  本文涉及的知识点:

  动态库&静态库的基本概念

  动态库&静态库的区别&加载方式

  库

  库是程序代码的集合,将多个文件组织起来。是共享程序代码的一种方式。

  本质上:库是一段编译好的二进制代码,可以被载入内存中使用。使用库的时候需要对库的代码进行Link,而Link有两种方式:静态和动态,从而产生了静态链接库和动态链接库的概念

  动态库

  以.tbd或者.framework为文件后缀名(Xcode7之前是.dylib)

  动态库在编译时不会被copy进目标文件中,而是在程序运行过程中要使用时,被dyld加载进内存。(通过在目标文件中设置正确的rpath来找到动态库并使用)

  系统的Framework是动态库,可以被其他应用共享,比如Foundation.framework/UIKit.framework,自己创建的动态库,打包上传appstore时保留在沙盒中,所以是不支持共享的。不过,iOS8上开放了AppExtension功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。

  dyld加载动态库时,会检查framework的签名,签名中必须包含TeamIdentifier,并且framework和宿主app的TeamIdentifier必须一致。

  App中与动态库可以存在相同代码,不会产生冲突(对于动态库,编译器只会打个标机,并不会链接。链接会推迟到使用时,彼此保持独立)

  优点:

  不需要拷贝库代码到目标程序中,不会增大目标程序的体积

  多个应用程序共享内存中得同一份库文件,节省资源(系统库,自定义的库可以与AppExtension共享)

  整个应用程序分模块,团队合作

  应用插件化

  可以动态更新应用程序,模块实时升级

  缺点:

  载入时消耗性能;验证签名,载入内存都会大量消耗性能

  动态更新库文件,上架Appstore会被拒绝

  配置繁琐,需要适配各个cpu架构

  静态库

  以.a或者.framework为文件后缀。

  .a是一个纯二进制文件,.framework中除了二进制文件外,还有资源文件

  它的链接方式是在编译时就copy一份代码到目标文件中,这段代码就不会再变动。在build过程中参与链接,合并到目标文件中

  链接时:链接器只会将静态库中被使用的部分合并到可执行文件中去

  优点:

  模块化,分工合作

  避免了大量的重复编译操作,提高编译速度

  大大提高打包速度

  代码的保密(像常用的SDK:比如高德、微信、Jpush等都用的是静态包)

  提高代码的复用率

  不需要外部的函数库支持

  缺点:

  目标文件过大

  库文件抽取复杂,耗时耗力

  库文件修改后,需重新编译使用

  调试难度变大,无法断点

  

Copyright © 2009-2020 郑州易诺信息技术有限公司(www.haofeige.com) All Rights Reserved.
鄂公网安备豫ICP备2022028127号-1