根据我的研究,iOS 使用大多数(全部)系统框架作为动态框架。当应用程序启动时,iOS 会加载所有这些吗?或者当 iOS 实际需要该框架时,iOS 可能会稍后加载它?
在应用启动时加载它的好处:iOS 调用动态框架中的函数时节省更多时间。
懒加载的好处:节省更多内存。
根据我的研究,iOS 使用大多数(全部)系统框架作为动态框架。当应用程序启动时,iOS 会加载所有这些吗?或者当 iOS 实际需要该框架时,iOS 可能会稍后加载它?
在应用启动时加载它的好处:iOS 调用动态框架中的函数时节省更多时间。
懒加载的好处:节省更多内存。
或者当 iOS 实际需要框架时,iOS 可能会稍后加载它?
关于动态链接的Wikipedia 页面涵盖了各种流行操作系统的一般概念和一些特定的细节。它(部分)谈到了达尔文,包括 macOS 和 iOS:
macOS 和 iOS 平台上的可执行文件在进程执行过程中经常与动态链接器交互;甚至已知可执行文件可能与动态链接器交互,导致它在最初启动数小时后加载更多库并解析更多符号。
此外,如果您阅读dyld
动态加载程序的手册页,您会发现一个名为的环境变量DYLD_BIND_AT_LAUNCH
,其描述如下:
设置后,动态链接器将绑定程序在启动时需要的所有未定义符号。这包括通常可以在第一次调用时延迟绑定的函数符号。
最后一个证据在 Apple 的动态库概述文档中,其中部分内容是:
当应用程序启动时,OS X 内核将应用程序的代码和数据加载到新进程的地址空间中。内核还将动态加载程序( /usr/lib/dyld )加载到进程中并将控制权传递给它。然后动态加载器加载应用程序的依赖库。这些是应用程序链接的动态库。静态链接器在链接应用程序时记录每个依赖库的文件名。此文件名称为动态库的安装名称。
在下一段中:
动态加载器仅解析应用程序在启动过程中实际使用的未定义外部符号。在应用程序使用它们之前,其他符号仍然无法解析。
考虑到这一切,听起来 iOS 可能会在启动应用程序的过程中加载每个动态框架,但会将应用程序中未定义的名称实际绑定到框架中的定义,直到真正需要它。
苹果文档说:
框架是一个包(结构化目录),其中包含动态共享库以及相关资源,例如 nib 文件、图像文件和头文件。当您开发应用程序时,您的项目会链接到一个或多个框架。例如,iPhone 应用程序项目默认链接到 Foundation、UIKit 和 Core Graphics 框架。您的代码通过应用程序编程接口 (API) 访问框架的功能,API 由框架通过其头文件发布。由于库是动态共享的,因此多个应用程序可以同时访问框架代码和资源。系统根据需要将框架的代码和资源加载到内存中,并在所有应用程序之间共享资源的一份副本。