什么是动态框架而不是非动态框架?
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和它的扩展可以使用同一个动态库。
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和它的扩展可以使用同一个动态库。