Swift学习笔记之公用库和模块化

静态库和动态库

先补充一下静态库和动态库的知识。这部分内容我也不太熟,没有开发经验,如有错误欢迎打脸。

静态库

静态库的代码追加到可执行文件内,被多次使?用就有多份冗余拷?。

好处就是应用程序包自身可以独立运行,而不好的地方就是包会略显臃肿,库不能共享。

iOS 中静态库的形式是 .a 和 .framework (自己创建的 .framework 是静态库)。

.a

.a 文件在真正使用的时候需要提供头文件和资源文件。以前 Xcode 中默认提供的就是这种方式。不过编译出来静态库只支持特定的一种硬件架构体系,如果你想生成一个 Universal 的静态库的话,需要通过工具来将多个静态库进行合并。而且使用的时候需要另外配合 .h 文件,相比之下 framework 会是更好的选择。

.framework

framework 不但可以包含二进制文件,还可以包含头文件,资源文件等,甚至可以支持多个版本。不过各个应用所使用的自己的公用库,最终都需要 link 进可执行文件,所以本质上还是一个静态库。

动态库

动态库的代码和可执行文件是分开独立的,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用节省内存。

动态库的优劣与静态库相反,动态链接库需要库环境,但由于本身不集成库内容,会比较小,同时也为和其他应用共享库的使用提供了可能。

iOS 中动态库的形式是 .dylib 和 .framework (系统的 .framework 是动态库)。

现状

出于安全层面的考虑, AppStore 不允许使用第三方的动态链接库。我们可以通过 framework 编写自己的公用库。随着 Xcode6 开始支持新建 framework ,再也不用手动配置了。iOS-Universal-Framework 也宣布停止更新。

模块

模块化 (modules) 是在 2012年的 LLVM Developers Meeting 中提出的。简单说就是用树形的结构化描述来取代以往的平坦式 #include ,对框架进行封装,从而解决以往方法的脆弱性和扩展性不足的问题。 (这段我也不太懂,只是翻译了一下。。。)

以 UIKit 为例, module.map 大概是这个样子:

framework module UIKit {
    umbrella header "UIKit.h"
    module * {export *}
    link framework "UIKit"
}

使用的时候用 @import 即可。如果所有代码都需要这样重写必定是一项浩大的工程,所以 Apple 已经提前把这部分工作做好了。只要使用的是 iOS7 的 SDK,将 Enable Modules 打开后,然后保持原来的 #import 写法就行了,编译器会在编译的时候自动地把可能的地方换成 modules 的写法去编译。


References

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 21:13:54

Swift学习笔记之公用库和模块化的相关文章

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

Swift学习笔记七:闭包

闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. Swift 会为您管理在 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 3. 闭包表达式是一个可以捕获其上下文中变量或常量值的没有名字的闭包 一.闭包表达式 闭包函数类似于Objective-C中的block.下面我们用事实说话: let counts =

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&