Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当应用程序启动时,iOS是否将所有系统动态框架加载到内存中?_Ios_Frameworks_Dynamic Frameworks - Fatal编程技术网

当应用程序启动时,iOS是否将所有系统动态框架加载到内存中?

当应用程序启动时,iOS是否将所有系统动态框架加载到内存中?,ios,frameworks,dynamic-frameworks,Ios,Frameworks,Dynamic Frameworks,根据我的研究,iOS使用大多数(所有)系统框架作为动态框架。当应用程序启动时,iOS是否会加载所有应用程序?或者iOS可能会在iOS实际需要框架时加载它 当应用程序启动时加载它的优点: 当iOS调用动态框架中的函数时,可以节省更多时间 惰性加载的优点是: 节省更多内存 或者iOS可能会在iOS实际需要框架时加载它 本手册涵盖了各种流行操作系统的总体思路和一些具体细节。它(部分)提到了达尔文,包括macOS和iOS: macOS和iOS平台上的可执行文件在执行过程中经常与动态链接器交互;我们甚至知

根据我的研究,iOS使用大多数(所有)系统框架作为动态框架。当应用程序启动时,iOS是否会加载所有应用程序?或者iOS可能会在iOS实际需要框架时加载它

当应用程序启动时加载它的优点: 当iOS调用动态框架中的函数时,可以节省更多时间

惰性加载的优点是: 节省更多内存

或者iOS可能会在iOS实际需要框架时加载它

本手册涵盖了各种流行操作系统的总体思路和一些具体细节。它(部分)提到了达尔文,包括macOS和iOS:

macOS和iOS平台上的可执行文件在执行过程中经常与动态链接器交互;我们甚至知道,可执行文件可能会与动态链接器交互,导致它在最初启动数小时后加载更多库并解析更多符号

此外,如果您阅读动态加载器
dyld
的手册页,您会发现一个名为
dyld\u BIND\u的环境变量,它在启动时被描述为:

设置此选项后,动态链接器将绑定程序在启动时所需的所有未定义符号。这包括在第一次调用时通常可以延迟绑定的函数符号

最后一项证据在苹果的文件中,其中部分内容是:

当应用程序启动时,OSX内核将应用程序的代码和数据加载到新进程的地址空间中。内核还将动态加载程序(/usr/lib/dyld)加载到进程中,并将控制权传递给它。然后,动态加载程序加载应用程序的相关库。这些是应用程序链接的动态库。静态链接器记录应用程序链接时每个依赖库的文件名。此文件名称为动态库的安装名

在下一段:

动态加载程序仅解析应用程序在启动过程中实际使用的未定义外部符号。在应用程序使用其他符号之前,它们将一直无法解析

考虑到所有这些,听起来iOS可能会在启动应用程序的过程中加载每个动态框架,但会推迟将应用程序中未定义的名称实际绑定到框架中的定义,直到实际需要为止。

Apple doc说:

框架是一个包含动态共享库以及相关资源(如nib文件、图像文件和头文件)的捆绑包(结构化目录)。开发应用程序时,项目链接到一个或多个框架。例如,默认情况下,iPhone应用程序项目链接到基础、UIKIT和核心图形框架。您的代码通过应用程序编程接口(API)访问框架的功能,API由框架通过其头文件发布。因为库是动态共享的,所以多个应用程序可以同时访问框架代码和资源系统根据需要将框架的代码和资源加载到内存中,并在所有应用程序之间共享资源的一个副本。


参考资料:

这里的媒体文章说:“另一方面,动态框架保存在app frameworks目录中,仅在必要时加载,但它们在启动时链接到项目” — Cyril Cermak我不确定它是否真的能像本文在iOS中所说的那样工作。对于这一部分,
动态加载程序然后加载应用程序的依赖库。
,我认为苹果仍然可以延迟加载应用程序的依赖库。对于这一部分,
动态加载程序只解析应用程序在启动过程中实际使用的未定义外部符号。在应用程序使用其他符号之前,它们一直无法解析。
这看起来就像解析符号(与
链接
?)和加载到内存中的操作是分开的;它谈论的是Cocoa和AppKit,而不是Cocoa Touch和UIKit。机制可能类似,但不清楚iOS上的第三方框架是否与macOS上的动态框架遵循相同的规则。