2015-02-07 67 views

回答

3

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

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

构建项目时。

您的代码将内置到二进制文件中,我们将其称为MyProjectBinary。 如果你的项目链接到一个静态库,然后建立MyProjectBinary,链接器检查MyProjectBinary中的符号,如果它使用静态库的一部分,例如,在静态库中使用一个类),那么链接器将复制所有与班级相关的符号,并将它们合并到MyProjectBinary。所以无论您使用多少个静态库,您只能得到一个建筑结果,即MyProjectBinary

如果你链接到动态库,那么你告诉链接器,当MyProjectBinary正在运行时,会在适当的位置有该动态库。动态库不是魔术,事实上,你已经使用了很长时间。 Apple提供的所有框架都是动态库。当您的应用程序在设备/模拟器上运行时,它们将保证存在。

我们假设您的项目链接到名为MyDynamicLibrary的动态库。在构建项目时,首先MyProjectBinary仍然与使用静态库一样生成。然后,链接器只需添加一些信息到MyProjectBinary,在运行时标记在哪里找到“MyDynamicLibrary”。从MyDynamicLibrary什么都不会被添加到MyProjectBinary

当运行项目:

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

对于使用动态库项目,当你的代码调用的函数,而在MyDynamicLibrary,系统将尝试根据存储在MyProjectBinary的信息找到MyDynamicLibrary,如果它发现MyDynamicLibrary,然后为MyProjectBinary,该函数用于像在MyProjectBinary。如果找不到MyDynamicLibrary,则会发生错误,并且您的应用将被终止。

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

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

但是,当iOS 8出现时,您可以在一个应用程序中提供多个可执行二进制文件,其他二进制文件是扩展的可执行二进制文件。这带来了一个问题,如果有一些代码被多个可执行二进制文件使用,并且使用静态库,那么相同的符号将被复制到每个可执行文件中,因此需要更多的空间。这是动态库派上用场的时候,我们可以将这些代码放入动态库中,并且只为应用程序提供动态库的一个副本,应用程序及其扩展可以使用相同的动态库。