### Framework Of Library

1. [Сборка статических и динамических библиотек swift с помощью компилятора swift ](https://libeldoc.bsuir.by/bitstream/123456789/43790/1/Yurchenko_Sborka.pdf)
2. [Link fast: Improve build and launch times](https://developer.apple.com/videos/play/wwdc2022/110362/)
3. [Статические и динамические фреймворки на iOS - обсуждение с ChatGPT](https://vc.ru/dev/570484-staticheskie-i-dinamicheskie-freymvorki-na-ios-obsuzhdenie-s-chatgpt)
4. [!!!Swift. Static and Dynamic Libraries. Frameworks](https://maxim-kryloff.medium.com/swift-static-and-dynamic-libraries-frameworks-343952d3011e)
5. [!!!Swift. Packages and Bundles. Resources](https://maxim-kryloff.medium.com/swift-packages-and-bundles-resources-82f06c66b19e)

## Types of Files

![TypesOfFiles](/pictures/ComputerScience/TypesOfFiles.jpg?raw=true)

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

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

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

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

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

## Framework

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

![Frameworks](/pictures/ComputerScience/Frameworks.jpeg?raw=true)

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

![DynamicLibraries](/pictures/ComputerScience/DynamicLibraries.jpeg?raw=true)

## Библиотеки

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

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

![StaticLibraries](/pictures/ComputerScience/StaticLibraries.jpeg?raw=true)

### Static Linkage And Dynamic Linkage

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

![StaticLinkageAndDynamicLinkage](/pictures/ComputerScience/StaticLinkageAndDynamicLinkage.jpeg?raw=true)

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

![Mach-OFormat](/pictures/ComputerScience/Mach-OFormat.jpeg?raw=true)

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

Технически библиотека отличается от фреймворка тем, что называется [инверсией управления](https://ru.wikipedia.org/wiki/Инверсия_управления). 

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

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

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

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

### Conflict with assets

В iOS ресурсы пакета ([bundle приложения](/4%20Linkage/4.4%20CI-CD/4.4.1%20CI-CD.md) расположены в [bundle](/4%20Linkage/4.4%20CI-CD/4.4.1%20CI-CD.md) верхнего уровня. Вы также можете создать свою собственную папку и поместить туда любые ресурсы или файлы, которые захотите. 
> Единственное требование — папка не должна называться «Ресурсы», потому что такая уже есть по дефолту

!!! Допустим, у вас есть модуль, у которого есть своя папка 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татические и динамические — это два типа предварительно скомпилированных библиотек. Основные различия между ними заключаются в этапе их линковки, их влиянии на размер и производительность приложения.

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

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

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

---

[4.1 Frameworks Theme Folder](../4.1%20Frameworks/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.1.2 UIKit Theme Folder](./4.1.2%20UIKit/)
