什么是动态框架而不是非动态框架?

What is a dynamic framework as opposed to a non-dynamic one?

Xcode 6 允许动态框架。

什么是动态框架?

动态框架和静态框架都是一个包含二进制文件和其他一些东西的包。二进制称为动态库或静态库。

二进制就是你编译后的代码,你的函数,classes,方法成为二进制形式,它们被称为符号。

构建项目时。

您的代码将构建为二进制文件,我们称之为 MyProjectBinary。 如果你的项目 links 是一个静态库,那么在构建 MyProjectBinary 之后,linker 检查 MyProjectBinary 中的符号,如果它使用了静态库的某些部分,例如,使用class在静态库中),然后linker会复制所有与class相关的符号,并将它们组合成MyProjectBinary。所以无论你使用多少个静态库,你都只会得到一个构建结果,即MyProjectBinary.

如果你link到动态库,那么你是在告诉linker,当MyProjectBinary是运行时,那个动态库会在合适的地方。动态库并不神奇,事实上,您已经使用它们很长时间了。 Apple 提供的所有框架都是动态库。当您的应用在 device/simulator.

上 运行 时,它们保证存在

让我们假设您的项目 link 是一个名为 MyDynamicLibrary 的动态库。在构建你的项目时,首先 MyProjectBinary 仍然会像使用静态库一样生成。然后,linker 只需将一些信息添加到 MyProjectBinary,标记在运行时在哪里可以找到 "MyDynamicLibrary"。 MyDynamicLibrary 中的任何内容都不会添加到 MyProjectBinary

当运行你的项目:

对于使用静态库的项目,没有什么特别的发生,因为所有需要的代码都在MyProjectBinary里面,它只是运行。

对于使用动态库的项目,当你的代码调用MyDynamicLibrary中的函数时,系统会根据MyProjectBinary中存储的信息尝试查找MyDynamicLibrary,如果它找到 MyDynamicLibrary,然后对于 MyProjectBinary,函数的使用方式与 MyProjectBinary 中的一样。如果找不到 MyDynamicLibrary,则会发生错误,您的应用程序将被终止。

那么为什么我们需要 iOS 8 的动态库?

在iOS8之前,一个应用程序只能有一个可执行二进制文件,所以使用静态库是可以的。

但是当iOS8到来时,您可以在一个应用程序中交付多个可执行二进制文件,额外的二进制文件是扩展的可执行二进制文件。这就带来了一个问题,如果有一些代码被多个可执行二进制文件使用,如果使用静态库,相同的符号将被复制到每个可执行文件中,因此需要更多 space。这时候动态库就派上用场了,我们可以把这些代码放在动态库中,只为app交付一份动态库,app和它的扩展可以使用同一个动态库。