iOS中的动态库和静态库

库的描述:

库就是程序代码的集合,将N个文件整合起来,实现特定的功能模块儿,从而更好的实现代码共享。本质上是一种可执行文件的二进制格式,可以被载入内存中执行。库可分为开源库和闭源库,开源库比如常用的AFNNetWorking以及SDWebImage,其实现的代码是开放可见的。闭源库比如苹果提供的UIKit等库,只能看见其开放的.h文件,无法查看对应的方法实现部分。iOS中的闭源库又分为静态库和动态库。

静态库和动态库的区别:

  • 存在形式的区别:

静态库有" .a " 和 “.FrameWork"两种形式。
动态库有”.tbd" 和 ".FrameWork"两种形式;系统直接提供给我们的.FrameWork都是动态库。

  • .a和.FrameWork的区别:

.FrameWork = .a + .h + bondle(.a为纯二进制文件,需要配合.h文件才能使用,如果其中有用到图片等资源文件的话,需要将资源文件打包成与.a同名的.bondle来配合其使用。在.a中使用.bondle中的资源时需要指明资源所在的bondle,例如使用图片:
[UIImage imageNamed:@“pic” inBundle:<#(nullable NSBundle *)#> compatibleWithTraitCollection:<#(nullable UITraitCollection *)#>])
所以我们在使用库的时候尽量使用.FrameWork的形式比较方便。

  • 静态库的好处:

模块化。便于团队合作开发,提高代码的复用程度以及核心技术的保密性。
避免经常性的少量改动导致大量的重复编译连接。
可以重用,但不是共享使用。

  • 动态库的好处:

减小最终可执行文件的体积,便于团队分工合作,提高代码重用性,便于将应用模块化。
多个程序可以共享内存中同一份库资源,节省内存空间。
可以在不重新编译应用程序的前提下,通过更新动态库的方式来达到更新应用程序功能的目的。
可以使应用插件化。
可以对软件版本进行实时的模块儿更新。

  • 使用机制的区别:

静态库在编译链接时会完整的拷贝一份到可执行文件中去,所以在运行时就不需要原始的库文件了。如果多个app都使用同一个静态库,那么每个app都会拷贝一份静态库文件。所以会比较浪费内存。

动态库不会复制,动态库加载到内存中后在内存中只会存在一份,多个应用可以使用内存中同一份库资源。所以会比较节省内存。由于静态库把编译连接以及绑定的过程放在编译期完成,而动态库则是在运行时统一处理上述过程。所以在动态库初次加载时要比静态库耗时,但是初次加载成功后就不存在这些问题了。

需要注意的是在iOS8之前苹果是不允许第三方框架使用动态库方式实现的,iOS8之后才允许第三方框架使用动态库,但是只能使用苹果提供的CocoTouchFrameWork方式创建,使用CocoTouchFrameWork创建的动态库在打包提交到app的时候会放在app main bundle 根目录下运行在沙盒中并不是在系统中,所以即使是动态库,多个app使用也是要分别打包和签名的,不过在iOS8之后可以使用app extension通过插件的方式来实现动态库的共享。

使用动态库开发的项目不允许在appStore上架,所以如果是企业级的用可以通过动态库实现项目的实时更新。由于动态库的动态更新绕过了苹果的appStore审核机制,所以苹果不允许使用自定义动态库的应用在appStore上线。

** iOS中应用代码的编译过程:**

  • pre-process 预处理:替换宏,删除注释,展开头文件,产生 .i文件。

  • compling 编译:将 .i文件转换为汇编语言,产生.s文件。

  • assembly 汇编:把汇编文件转换为机器码文件,产生.o文件。

  • link 链接:对.o文件中引用其他库的地方进行引用,生成最后的可执行文件。

下篇中记录一下库的创建和使用过程。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值