ios 静态库(.a和.framework) 动态库(.dylib和.framework)

什么是库?

库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。

什么时候我们会用到库呢?

一种情况是,某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。
另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要Link一下,不会浪费编译时间。

iOS 中的链接(Linking) 是为了链接你的应用中会用到的库。在实际开发过程中,一个库一般都包括了可执行代码,公共的头文件和资源,这些库可以被链接器连接到你的应用。

上面提到库在使用的时候需要Link,Link 的方式有两种,静态和动态,于是便产生了静态库和动态库

  • 动态库形式:.dylib和.framework
  • 静态库形式:.a和.framework
  • 动态库和静态库的区别

静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝

link 静态库

link 动态库 

 

 

  1. 静态库在编译时加载,链接时会完整的复制到可执行文件中。
  2. 静态库的可执行文件通常会比较大,因为所需的数据都会被整合到目标代码中,因此编译后的执行文件不需要外部库的支持,直接就能使用。
  3. 有多个app使用就会被复制多份,不能共享且占用更多冗余内存。
  4. 所有的函数都在库中,因此当修改函数时需要重新编译

注释:.a 和 .framework 的区别,推荐生成使用.framework。

  • .a是单纯的二进制文件,.framework是二进制文件+资源文件。
  • 其中.a不能直接使用,需要 .h文件配合,而.framework则可以直接使用。
  • .framework = .a + .h + sourceFile(资源文件)

系统动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

动态库的作用

应用插件化:

每一个功能点都是一个动态库,在用户想使用某个功能的时候让其从网络下载,然后手动加载动态库,实现功能的的插件化

关于Framework

  • framework为什么既是静态库又是动态库?

系统的.framework是动态库,我们自己建立的.framework一般都是静态库。但是现在你用xcode创建Framework的时候默认是动态库,一般打包成SDK给别人用的话都使用的是静态库,可以修改Build SettingsMach-O TypeStatic Library

  • 什么是framework

Framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用。一般如果是静态Framework的话,资源打包进Framework是读取不了的。静态Framework和.a文件都是编译进可执行文件里面的。只有动态Framework能在.app下面的Framework文件夹下看到,并读取.framework里的资源文件。

Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。

平时我们用的第三方SDK的framework都是静态库,真正的动态库是上不了AppStore的(iOS8之后能上AppStore,因为有个App Extension,需要动态库支持)。

参考:

iOS里的动态库和静态库 - 简书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值