Skip to content

Latest commit

 

History

History
94 lines (51 loc) · 11.6 KB

4.1.1 FrameworkOrLibrary.md

File metadata and controls

94 lines (51 loc) · 11.6 KB

Framework Of Library

  1. Сборка статических и динамических библиотек swift с помощью компилятора swift
  2. Link fast: Improve build and launch times
  3. Статические и динамические фреймворки на iOS - обсуждение с ChatGPT
  4. !!!Swift. Static and Dynamic Libraries. Frameworks
  5. !!!Swift. Packages and Bundles. Resources

Types of Files

TypesOfFiles

Линковка модулей

В разработке для iOS/MacOS существует два типа линковки модулей:

  • библиотека и ее синонимы, такие как статическая библиотека, статический фреймворк;
  • framework и его синонимы, такие как динамический фреймворк;

Говоря о библиотеках или статических фреймворках, люди подразумевают статические библиотеки — модули, которые полностью встроены в исполняемый двоичный файл результата.

Говоря о фреймворках, они относятся к динамическим библиотекам, которые обернуты фреймворками и связаны с исполняемым двоичным файлом через ссылки на их функции.

Framework

Software Framework (скелет, API) - скомпилированный набор кода, который выполняет определенную задачу... Cледовательно, вы можете фактически иметь статическую или динамическую структуру, которые обычно являются просто скомпилированными версиями библиотеки.

Фреймворк от библиотеки в iOS отличается тем, что Фреймворк - это тот модуль, методы/переменные которого могут в дальнейшем использоваться;

Библиотеки

Библиотека в рамках языка программирования Swift – это набор компонентов Swift, которые могут использовать другие приложения, подключается как полноценная часть приложения. Источник: Усов В., Swift Основы разработки приложений под iOS и macOS, Питер, 2018. – 444 с.

Библиотеки позволяют использовать один и тот же код в разных проектах, что позволяет не копировать один и тот же одинаковый код, а просто подключить библиотеку, которая содержит решения необходимой задачи. Например, существуют различные библиотеки для работы со строками, как правило такие библиотеки уже содержат в себе реализацию таких задач как разбиение строки на слова, поиск слова в строке, вставка слова в необходимое место в строке.

Static Linkage And Dynamic Linkage

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

Mach-O это бинарник (формат файла с машинным кодом внутри) - все скомпилированные файлы имеют такой формат, но могут иметь разные форматы и как результат разный способ использования:

Техническое различие библиотеки vs фреймворка

Технически библиотека отличается от фреймворка тем, что называется инверсией управления.

  1. Используя библиотеку, программист самостоятельно отвечает за поток приложения. Только он решает, когда привлекать к работе стороннюю функциональность.

  2. Фреймворк же сам отвечает за поток. Он предоставляет несколько мест для размещения вашего кода, но вызываться его или нет – решает он сам. не встраивается в результирующий бинарник из-за динамической компоновки

Фреймворк управляет кодом программиста, а не программист управляет фреймворком.

Программист управляет библиотекой, а не библиотека кодом программиста

Conflict with assets

В iOS ресурсы пакета (bundle приложения) расположены в bundle верхнего уровня. Вы также можете создать свою собственную папку и поместить туда любые ресурсы или файлы, которые захотите.

Единственное требование — папка не должна называться «Ресурсы», потому что такая уже есть по дефолту

!!! Допустим, у вас есть модуль, у которого есть своя папка Assets.xcassets, как следствие — свой файл Assets.car. Если вы хотите собрать свой модуль как статическую библиотеку, вы можете уловить конфликт, который будет говорить: «I have the Assets.car (дефолтный) file from your module and the same file from the application. I don’t know what to do…» Пока конфликт не будет разрешен, вы не сможете создать свое приложение.

Вот несколько фактов о ресурсах модулей (assets):

  • Если вы создадите свой модуль как статическую библиотеку, его код будет встроен в исполняемый двоичный файл результата, а его ресурсы (изображения, плагины, строки, файлы .car (скомпилированный Assets.xcassets) и т. д.) будут помещены в пакет приложения, в самом верхем слое (уровня папки)

  • Если вы собираете свой модуль как фреймворк, его ресурсы будут помещены в отдельную папку пакета .framework (в результате никаких конфликтов с файлом Assets.car)

Соответственно, первое возможное решение конфликта Assets.car — использование фреймворков вместо статических библиотек)

Второе решение: Динамическая библиотека загружается во время выполнения, а символы (классы, методы и т. д.) не встроены в двоичный файл приложения, можно просто создать новый файл dylib (Mach-O Dynamic Library) и заменить старый, чтобы исправить ошибку. Таким образом, все приложения, которые ссылаются на эту зависимость, получат исправление. Нет необходимости перекомпилировать все, кроме ошибочного кода в самой динамической библиотеки,

Резюме

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

Cтатическая библиотека/статический фреймворк увеличивают размер приложения, но обеспечивают более быстрое время запуска и полностью встроены в исполняемый двоичный файл результата. Может создавать конфликты файлов ресурсов.

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

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


4.1 Frameworks Theme Folder | Back To iOSWiki Contents | 4.1.2 UIKit Theme Folder