文档章节

iOS中的动态库和静态库的区别

在人间2018
 在人间2018
发布于 2018/11/29 15:25
字数 1461
阅读 70
收藏 0
背景: 阿里的直播framwork是以动态库的形式提供的,经过沟通,由于他们使用了遵循LGPL协议的第三方库,所以只能以动态库的形式提供;
介绍

iOS中静态库的形式:.a .framework iOS中动态库的形式:.dylib .framework

其中系统的.framework是动态库,自己创建的.framework是静态库 将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。

iOS8.0以后支持的动态库

静态库和动态库的区别: 静态库:链接时完整拷贝到可执行文件中,多次使用就有多分拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,系统加载一次,多个程序共用

.a 和 .framework的区别:
  1. .a是纯二进制文件, .framework除了二进制文件还包含头文件和资源文件
  2. .a不能直接使用,需要头文件(.h)配合;framework可直接使用
  3. .a + .h + source = .framework
  4. Xcode在编译链接时,对于静态库和动态库的处理方式是有区别的:(此处感谢iOS知识小集最近的总结,解答了我对此处的疑惑,iOS开发可以关注该公众号)
  • 对于静态库,在链接时,Xcode会自动筛选出静态库中的不同architecture合并到对应处理器架构的主可执行二进制文件中;而在打包时,Xcode会自动忽略掉静态库中未用到的architecture,eg. i386、x86_64等模拟器架构;
  • 对于动态库,在编译打包时,Xcode会直接拷贝整个动态framework文件到最终的ipa包中,只有在App真正运行的时候才会动态链接。 但是苹果是不允许最终上传到App Store Connect后台的ipa文件包含模拟器架构的,会报Invalid Architectures。
framework中资源访问方法:

首先,framework中的资源不再mainbundle中,下面两种方式都可以访问其所在bundle:

//方法1:在framework中的随便一个类中即可访问
NSBundle *bundle =  [NSBundle bundleForClass:self.class];
//方法2:在任何地方都可以访问,其中com.xy.framwork为framework的CFBundleIdentifier
NSBundle *bundle =  [NSBundle bundleWithIdentifier:@"com.xy.framwork"];

然后就可以拿这个bundle来访问资源了

//访问图片
UIImage *image = [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil];
//访问文件,使用NSBundle的实例方法获取文件url或者路径
NSURL *sourceUrl = [bundle URLForResource:productName withExtension:@".xml" subdirectory:subDir];
NSString *filePath = [bundle pathForResource:productName ofType:@"xml" inDirectory:subDir];
Embedded Binaries 和 Linked Frameworks and Libraries的区别

官方介绍参考链接

  • Linked Frameworks and Libraries: 系统的framwork或者扩展程序中使用主程序中的framwork的时候,不需要把framwork包含到程序的bundle中,使用该模式

  • 对于静态库(.a):该方式会将静态库中的代码拷贝到主程序的ipa包中,ipa包体积也会随之变大;在运行时不需要再处理依赖关系,所有的事情都在编译链接阶段完成;

  • 对于动态库(.dylib、ystem-supplied framework):会将动态库放到系统的动态库存放目录,这样就不需要将第三方的外部库拷贝到主程序的ipa中,并且不同的程序都可以找到它使用它,这不仅节省了安装包大小,同时还节省了内存占用。

  • 当使用一个第三方的framwork(下载的或者自己生成的),它们并不会被放到操作系统上,在这种情况下,仅仅linked这个库就不行了,还需要在"Copy Frameworks" 时期把它嵌入到应用的ipa包里面,这样,在程序运行的时候,发现在系统动态库目录下找不到这个库,就能在应用程序包里面找到并使用它。

embed到应用中的动态库,就像是图片、音频等资源文件一样,只不过它是一个可执行文件,在运行时采取加载执行。

  • Embedded Binaries: Embed是把这个库嵌入到最终输出的程序的bundle里面。 如果是第三方的动态库(别人提供或者自己生成),就需要对该库进行embed
动态库包含动态库的问题:

一个动态库A.framework包含了另外一个动态库B.framework,然后将A提供给主工程使用;这种情况下,如果只提供了A给主工程,那么会在运行时报 image not found 的错误,查看了苹果文档, 发现在iOS开发中不支持这种做法,必须在主工程中同时embedA和B才能正常运行

#####如何区分一个framwork是静态库还是动态库:

命令行进入动态库文件,使用file命令可以看到区别,分别以腾讯分享framwork(静态)和阿里直播framwork(动态)为例展示:

cd TencentOpenAPI.framework
file TencentOpenAPI 

输出

TencentOpenAPI: Mach-O universal binary with 4 architectures: [arm_v7:current ar archive] [arm64]
TencentOpenAPI (for architecture armv7):	current ar archive
TencentOpenAPI (for architecture i386):	current ar archive
TencentOpenAPI (for architecture x86_64):	current ar archive
TencentOpenAPI (for architecture arm64):	current ar archive

archive表明这是一个静态库

cd AliyunPlayerSDK.framework
file AliyunPlayerSDK 

输出

AliyunPlayerSDK: Mach-O universal binary with 4 architectures: [i386:Mach-O dynamically linked shared library i386] [arm64]
AliyunPlayerSDK (for architecture i386):	Mach-O dynamically linked shared library i386
AliyunPlayerSDK (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
AliyunPlayerSDK (for architecture armv7):	Mach-O dynamically linked shared library arm_v7
AliyunPlayerSDK (for architecture arm64):	Mach-O 64-bit dynamically linked shared library arm64

dynamically linked shared library表明这是一个动态库

© 著作权归作者所有

在人间2018
粉丝 1
博文 23
码字总数 8813
作品 0
海淀
程序员
私信 提问
一个静态库框架模板: iOS Universal Framework Mk 7

一个静态库框架模板: iOS Universal Framework Mk 7 分类: iPhone开发 2012-03-19 15:57 109人阅读 评论(0) 收藏 举报 项目地址: https://github.com/kstenerud/iOS-Universal-Framework...

晨曦之光
2012/05/28
4.8K
0
Xcode制作动态及静态Framework

有没有写SDK或者要将一些常用的工具类做成Framework的经历? 你或许自己写脚本完成了这项工作,相信也有很多的人使用 iOS-Universal-Framework ,随着Xcode 6的发布,相信小伙伴们已经都知道了...

余成海
2015/10/28
0
0
深入iOS系统底层之静态库介绍

少长咸集,群贤毕至。--《王羲之・兰亭集序》 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令...

欧阳大哥2013
02/06
0
0
.a .framework打包注意事项

静态库中使用了C++混编 我们都知道在OC项目中使用了C++文件来混编的话,就会报如图所示的错误。其最快捷的解决方法就是将项目中的一个文件的.m后缀改成.mm。 如果在制作静态库时也使用了C++...

_故事的小黄瓜_
2018/05/17
0
0
iOS开发之Xcode打包framework

下文是转载,本人觉得这个打包framework还是一个比较重要的功能,可以用来做一下事情: (1)封装功能模块,比如有比较成熟的功能模块封装成一个包,然后以后自己或其他同事用起来比较方便。...

阿里阿力
2014/01/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mongodb安装、连接,mongodb用户管理、创建集合、数据管理、备份恢复,副本集介绍、搭建、测试,分片介绍、搭建、测试,php的mongodb扩展、mongo扩展

21.26 mongodb介绍 21.27 mongodb安装 21.28 连接mongodb 21.29 mongodb用户管理 21.30 mongodb创建集合、数据管理 21.31 php的mongodb扩展 21.32 php的mongo扩展 21.33 mongodb副本集介绍 ...

tobej
27分钟前
2
0
C++的变量初始化

C++中变量的初始化有很多种方式,如:默认初始化,值初始化,直接初始化,拷贝初始化,列表初始化。 1、默认初始化:默认初始化是指定义变量时没有指定初值时进行的初始化操作。 如:int a;...

天王盖地虎626
49分钟前
1
0
MySQL-入门(一)

一、SQL的分类 DDL(Data Definition Language):数据定义语言,用来操作数据库对象:库、表、列等; DML(Data Manipulation Language):数据操作语言,用来增删改数据库中的数据; DCL(...

潜行-L
51分钟前
1
0
微服务架构在Kubernetes上的实现

我们讨论了最近的微服务趋势,以及伴随微服务架构可能出现的一些复杂问题。在接下来的几周内,我们将深入探讨这个问题。我们将探讨不同设计选择中固有的权衡,以及可以采取哪些措施来缓解这些...

别打我会飞
53分钟前
4
0
IDEA2018导入eclipse web项目

看别人的攻略:https://blog.csdn.net/qq_33229669/article/details/83751316 完成之后,出现了IDEA编译java报错:找不到符号_的解决方法错误, 然后百度出来是编码问题, 1.更改editor的文件编码...

流光韶逝
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部