Загружает ли iOS всю динамическую структуру системы в память при запуске приложения?

Судя по тому, что я изучаю, iOS использует большинство (все) системных фреймворков в качестве динамических. Загружает ли iOS их все при запуске приложения? Или iOS может загрузить его позже, когда iOS действительно понадобится фреймворк?

Преимущество загрузки при запуске приложения: экономия времени, когда iOS вызывает функции в динамических фреймворках.

Преимущество ленивой загрузки: экономия памяти.

2 ответа

Или iOS может загрузить его позже, когда iOS действительно понадобится фреймворк?

Страница Википедии о динамических ссылках охватывает как общую идею, так и ряд деталей, характерных для различных популярных операционных систем. Это (частично) говорит о Дарвине, включая macOS и iOS:

Исполняемые файлы на платформах macOS и iOS часто взаимодействуют с динамическим компоновщиком во время выполнения процесса; известно даже, что исполняемый файл может взаимодействовать с динамическим компоновщиком, заставляя его загружать больше библиотек и обрабатывать больше символов через несколько часов после его первоначального запуска.

Кроме того, если вы читаете страницу руководства для dyld, динамический загрузчик, вы найдете переменную среды с именем DYLD_BIND_AT_LAUNCH который описывается так:

Когда это установлено, динамический компоновщик связывает все неопределенные символы, необходимые программе во время запуска. Сюда входят функциональные символы, которые обычно лениво связываются во время первого вызова.

Последнее свидетельство содержится в документе Apple " Обзор динамических библиотек", в котором частично говорится:

Когда приложение запускается, ядро ​​OS X загружает код и данные приложения в адресное пространство нового процесса. Ядро также загружает динамический загрузчик ( /usr/lib/dyld) в процесс и передает ему управление. Затем динамический загрузчик загружает зависимые библиотеки приложения. Это динамические библиотеки, с которыми связано приложение. Статический компоновщик записывает имена файлов каждой из зависимых библиотек во время связывания приложения. Это имя файла известно как имя установки динамической библиотеки.

И в следующем абзаце:

Динамический загрузчик разрешает только неопределенные внешние символы, которые приложение фактически использует в процессе запуска. Остальные символы остаются неразрешенными, пока приложение их не использует.

Учитывая все это, похоже, что iOS, вероятно, загружает каждую динамическую структуру как часть процесса запуска приложения, но откладывает фактическую привязку неопределенных имен в приложении к определениям в структуре до тех пор, пока это действительно не понадобится.

Документ Apple говорит:

Платформа - это пакет (структурированный каталог), который содержит динамическую общую библиотеку вместе со связанными ресурсами, такими как файлы пера, файлы изображений и файлы заголовков. Когда вы разрабатываете приложение, ваш проект связывается с одним или несколькими фреймворками. Например, проекты приложений iPhone по умолчанию связаны с платформами Foundation, UIKit и Core Graphics. Ваш код получает доступ к возможностям фреймворка через интерфейс прикладного программирования (API), который публикуется фреймворком через свои файлы заголовков. Поскольку библиотека является динамически доступной, несколько приложений могут одновременно обращаться к коду и ресурсам платформы. Система загружает код и ресурсы фреймворка в память по мере необходимости и разделяет одну копию ресурса между всеми приложениями.

Ссылка: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Framework.html

Другие вопросы по тегам