iOS的静态库和动态库

一、静态库和动态库的区别

库:是资源文件和代码编译的一个集合

静态库: 静态库是在编译时,完整的拷贝至可执行文件中,被多次使用就有多次冗余拷贝;

动态库: 程序运行时由系统动态加载到内存,而不是复制,供程序调用。系统只加载一次,多个程序共用,节省内存。因此,编译内容更小,而且因为动态库是需要时才被引用,所以更快。

静态和动态的名字,区分了编译后的代码是以何种方式链接到目标程序中的。

二、静态库和动态库的形式

静态库:.a.framework

动态库: .dylib.framework

framework为什么可能是动态库,也可能是静态库?系统的.framework是动态库, 我们自己建立的.framework是静态库。

Bundle的概念,framework是一种特殊类型的Bundle,bunlde是一个包含多个子文件夹的文件夹。在iOS上,Bundlue将相关联的文件(比如图片, Nibs,代码)编译成一个包文件。程序将它当作一个单独文件来处理,你可以在不知道内部实现的情况下使用它。

而库需要一些其他资源:头文件,本地化文件,图片资源,文档和示例。我们可以将其打包成一个bunlde,这就是framework。

静态库包含静态资源包,动态库包含动态资源包,而且动态库可能包含同一个动态资源包的不同版本。

三、EMBEDDED, UNBRELLA, MODULAR

即使我们将资源文件(图片等)打包到frameworks里,Xcode仍然未能引用它们。通过embedding framework让我们可以访问这些资源文件,操作步骤见链接 add your framework in the "Embed Frameworks" section.

Umbrella frameworks的定义: Umbrella frameworks add minor refinements to the standard framework structure, such as the ability to encompass other frameworks

umberllar framework的目的是 隐藏不同frameworks之间的复杂依赖关系。它允许你将不同的frameworks合并成一个framework,输出部分头文件。为了构建一个umbrella framework,你必须包含umbrella header。

为了能够引入framework modular,我们必须引入 module map

framework module ModularFramework{
  module Modulel{
    header "File1.h"
  }
  module Module2{
    header "File2.h"
  }
}

随后,使用module

import ModularFramework.Module1
import ModularFramework.Module2

CocoaPods允许使用umbrella和modular frameworks。如果你引入了pods到你的项目里,在Target->YourApp->Build Settings找查找modulemapumbrella可以看到它们的设置。

四、CocoaPods相关

  1. Podfile

默认使用静态库,即 # use_frameworks!#是注释标示)
添加use_frameworks!表明Pod使用动态库, Pods/Products里都是动态库(.framework文件)
不添加use_frameworks!表明Pod使用静态库, Pods/Products里都是静态库(.a文件)

use_frameworks的效果

  1. 在使用静态库时,某些Pod不支持module怎么办?

可以使用use_modular_headers!来让所有Pod支持静态库;

或者对不支持静态库的Pod后面添加:modular_headers => true来使其支持module

五、#import和@import

可以先看个例子:

@import MapKit;
@import MapKit.MKAnnotation;
#import <MapKit/MKAnnotation.h>

@import是iOS7之后的新特性与法: Modules(模块导入)或者"语义引入"。Modules可以看成是可执行framework的集合,比#import更加快捷和高效。Enable Modules是默认打开的,在Target->YourApp->Build Setting->搜索Modules, 可以看到Enable Modules默认是YES,Link Frameworks Automatically也是默认打开的。打开后,使用原来的#import#include,编译器会在编译的时候自动把可能的地方换成modules的写法去编译。

@import的一个优势是开发者不需要手动将framework添加到project settings里面,它是自动完成的。

使用Modules的形式,可以使用@import MapKit;, 还可以只加载framework里的submodules,如@import MapKit.MKAnnotation;

六、常见问题

Q:可以在runtime时加载动态库吗?

A:不可以(除非你不想上AppStore)。苹果不允许在审核后更改app的行为,类似于热修复.

Q: 可以用Swift创建静态库吗?

A:在Xcode9后,可以。CocoaPods 1.5.0也支持Swift Static Framework.

Q:我可以使用多少动态库?有限制吗?

A:我们建议将动态库控制在一定范围内。虽然有可能创建很多的动态库,但是建议尽量不要创建太多的动态库,而使用静态库。

Q: Podfile使用静态库时出现报错[!] The following Swift pods cannot yet be integrated as static libraries:,如何解决?

A:pod install 时的错误信息提示我们应该使用use_modular_headers!来让整个项目支持静态库,或者对单个Pod使用:modular_headers => true

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容