OC 动态库与静态库的区别,对包体积大小的影响,与加载时机的说明

333 阅读4分钟

在Objective-C(OC)中,动态库(Dynamic Library)和静态库(Static Library)是两种不同的代码共享和链接方式,它们在多个方面有所区别,包括打包体积的影响。

动态库(Dynamic Library)

  1. 加载时机:动态库在运行时被加载到内存中,应用程序启动时并不会将动态库的代码包含在内,而是在需要时才加载。
  2. 共享性:多个应用程序可以共享同一个动态库的实例,这可以减少内存使用和磁盘空间。
  3. 更新与维护:更新动态库时,通常不需要重新编译使用它的应用程序,只需替换动态库文件即可。
  4. 打包体积:动态库不会被包含在应用程序的二进制文件中,因此对应用程序的体积影响较小。但是,应用程序在运行时需要依赖这些动态库,如果动态库缺失,应用程序可能无法运行。

静态库(Static Library)

  1. 加载时机:静态库在编译时被链接到应用程序中,应用程序的二进制文件包含了静态库的所有代码。
  2. 独立性:每个使用静态库的应用程序都有自己的库代码副本,不与其他应用程序共享。
  3. 更新与维护:更新静态库时,需要重新编译并链接使用它的所有应用程序。
  4. 打包体积:静态库的代码会被完整地包含在应用程序的二进制文件中,因此会增加应用程序的体积。

对包体积的影响

  • 动态库:对应用程序的体积影响较小,因为动态库本身不包含在应用程序的二进制文件中。但是,应用程序需要确保在运行时能够访问到这些动态库。
  • 静态库:对应用程序的体积影响较大,因为静态库的代码会被完整地包含在应用程序的二进制文件中。

总的来说,如果考虑应用程序的体积,动态库通常是更好的选择,因为它不会显著增加应用程序的体积。然而,这也取决于具体的应用场景和需求,例如是否需要频繁更新库文件、是否需要共享库实例等。

在Objective-C(OC)中,动态库(Dynamic Library)和静态库(Static Library)是两种不同的代码共享和链接方式,它们在多个方面有所区别,包括打包体积的影响。

动态库(Dynamic Library)与 静态库(Static Library)加载方式的不同

在应用程序启动时,动态库和静态库的加载方式有所不同:

动态库(Dynamic Library)

  1. 加载时机:动态库在应用程序启动时并不会立即加载到内存中。它们通常在应用程序运行过程中,当需要使用到动态库中的某个功能或资源时,才会被动态链接器(Dynamic Linker)加载到内存中。
  2. 加载过程:动态链接器负责解析应用程序对动态库的依赖,并在需要时将动态库映射到应用程序的地址空间中。这个过程可以是显式的(通过调用特定的系统函数如 dlopen())或隐式的(由操作系统自动处理)。

静态库(Static Library)

  1. 加载时机:静态库在编译时就被链接到应用程序的二进制文件中,因此在应用程序启动时,静态库的代码已经包含在应用程序的内存映像中。
  2. 加载过程:当应用程序启动时,操作系统会将整个应用程序(包括静态库的代码)加载到内存中,并开始执行应用程序的入口点(通常是 main() 函数)。

总结

  • 动态库:在应用程序运行过程中按需加载。
  • 静态库:在应用程序启动时就已经加载到内存中。

这种差异使得动态库在内存使用和应用程序体积方面具有优势,而静态库则在启动速度和运行时性能方面可能略有优势(因为不需要动态加载和链接)。选择使用动态库还是静态库,取决于具体的应用需求和资源管理策略。