use_frameworks!的作用、静态库与动态库、tbd

首先明确一下几个概念
这里写图片描述
从iOS8/Xcode6开始,苹果允许使用动态库链接
通过cocoapods管理应用程序时,在Podfile文件中,**use_frameworks!**的使用区别如下:

  • 使用**use_frameworks!**时dynamic frameworks 方式 -> .framework
cocoapods会生成对应的 frameworks 文件
在Link Binary With Libraries:会生成Pods_工程名.framework,包含了其它用cocoapods导入的第三方框架的.framework文件

这里写图片描述

  • 不使用**use_frameworks!**时static libraries 方式 -> 生成.a文件
cocoapods会生成相应的 .a文件(静态链接库)
Link Binary With Libraries: libPods-工程名.a 包含了其他用cocoapods导入有第三库的 .a 文件

这里写图片描述

1、纯OC项目中,通过cocoapods导入OC库时,一般都不使用use_frameworks!
2、纯swift项目中,通过cocoapods导入swift库时,必须使用use_frameworks!
3、只要是通过cocoapods导入swift库时,都必须使用use_frameworks!
4、使用动态链接库dynamic frameworks时,必须使用use_frameworks!

系统提供的库都是 dylib 动态库

什么是 tbd?“text-based stud libraries”的缩写,Xcode7开始引入的技术,为了减少Xcode中相应的SDK的体积,实际上是一个文本。

--- !tapi-tbd-v3
archs:           [ armv7, armv7s, arm64 ]
uuids:           [ 'armv7: DEA2F438-8531-392F-85B1-73240DD2A2EC', 'armv7s: A50A77BF-6473-3BBB-B0D1-92E3240D79DC', 
                   'arm64: E53F9393-BFC8-3EF5-8520-B0FE6B193183' ]
platform:        ios
install-name:    /System/Library/Frameworks/Foundation.framework/Foundation
current-version: 1452.23
compatibility-version: 300
objc-constraint: none
exports:         
  - archs:           [ armv7, armv7s ]
    symbols:         [ '$ld$add$os2.0$_OBJC_CLASS_$_NSURL', '$ld$add$os2.0$_OBJC_METACLASS_$_NSURL', 
                       '$ld$add$os2.1$_OBJC_CLASS_$_NSURL',  

其中有支持的架构、二进制文件的位置以及库中所有 symbols 的声明,是动态库的一个描述。

Xcode动态库的路径:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks

Foundation.framework也是一个dylib动态库,可以看到目录下有同名的tbd以及Headers(包含开发的API头文件)
Foundation.framework

动态库是在程序运行的时候才加载的,在Xcode中导入这些 framework 以及tbd只是对动态库的一个描述,目前是为了告诉编译器动态库中有这些API,以便于成功编译,否则编译不通过,提示 “Symbol not found” 错误。

真正的动态库存放在哪里?

在Foundation.framework的tbd文件中,可以看到其动态库的存放路径在“/System/Library/Frameworks/Foundation.framework/Foundation”,但实际上在越狱设备上并不能找到对应的文件,其他的库也是一样。
**在iOS系统中,系统库文件都被打包到一个缓存的文件中,即 dyld 缓存,位于/System/Library/Caches/com.apple.dyld/目录下,文件名是以“dyld_shared_cache_”**开头,再加上这个动态库 dyld支持的指令集。

参考链接1
参考链接2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值