Формат файлу Mach-O (Mach Object - .o
)
У світі iOS кожен вихідний файл перетворюється в об’єктні файли - ABI [About] Mach-O файл [About], який буде упакований у остаточний виконуваний пакет (наприклад, додаток, фреймворк ...), файл (наприклад, бібліотека ...) і його поведінка визначається Mach-O type
[Про]
Package
це каталог, який веде себе як файл - opaque file
. Він створений для користувацького досвіду для ускладнення внесення деяких змін у внутрішню структуру, які можуть спричинити непередбачувану поведінку програми. Пакет використовується в Document Package
або з Bundle
. Ви можете використовувати Show Package Contents
в Finder
Bundle
це каталог із певною структурою для організації бінарного (виконуваного коду) та ресурсів для цього коду (наприклад, зображення, ниби ...). Пакет містить Info.plist
[About] файл. Пакет створений для досвіду розробника . Також його можна упакувати. Існує кілька типів розшарування:
application bundle
- Application target
framework bundle
і versioned bundle
як підтип -Framework Target
loadable bundle
(aka plug-in bundle
) - Bundle target
(Пакет для тестування користувальницького інтерфейсу, Пакет тестування модулів)
- інші (
dSYM
[Про] пакет)
Application
- .ipa
, .app
[Про] - packaged
application bundle
- запуск програми.
Tests
- packaged
loadable bundle
який використовується для тестування двійкового. Плагінна архітектура дозволяє нам додавати нову функціональність (тестові випадки) як окремий модуль у існуючий бінарний файл
Бібліотеки та рамки
Мартін Фаулер на InversionOfControl
Бібліотека - це по суті набір функцій, за якими можна телефонувати, зазвичай організовані в класи. Кожен дзвінок виконує певну роботу і повертає контроль клієнту.
Рамка втілює деякий абстрактний дизайн із вбудованою більшою кількістю поведінки. Для того, щоб використовувати його, вам потрібно вставити свою поведінку в різні місця в рамках шляхом підкласифікації або підключення до власних класів. Код фреймворку потім називає ваш код у цих точках. Головне управління програмою перевернуто, віддалено від вас до рамки. (Інверсія управління)
Бібліотеки та рамки на iOS
Library
- це набір файлів об'єктів Mach-O [перевірка статичних чи динамічних], складених для однієї або декількох архітектур.
Static library
- .a
(він же бібліотека статичного архіву, статична пов'язана спільна бібліотека [doc] ) - Коли ви додасте його у свою програму, статичний посилання під час компіляції об'єднає об'єктні файли з бібліотеки та упакує їх разом із файлами об'єктів програми в один виконаний файл файл. Недоліком є великий вихідний файл
З Xcode 9.0 підтримується статична бібліотека Swift.
Dynamic library
- .dylib
(він же динамічна спільна бібліотека, спільний об'єкт, динамічно пов'язана бібліотека [doc] ) динамічно пов'язаний з виконуваним додатком під час завантаження або виконання , але не копіюється в нього. На практиці пакет програм буде містити папку Frameworks з .dylib
файлом. Всі системні бібліотеки iOS та macOS є dynamic
. Недоліком є повільний час запуску, оскільки всі динамічні бібліотеки повинні бути скопійовані та пов'язані.
[Статичні та динамічні зв'язки]
Text-based stub library
- .tbd
[About] , це текстовий заголовок dynamic library
якого розміщений на цільовому пристрої. В результаті ви не повинні пакувати динамічну бібліотеку у свій пакет. Він має ефект розміру.
Framework
aka binary framework
- .framework
це not packaged framework bundle
(щоб дозволити розробникам легко переглядати заголовки та ресурси), який містить складену static or dynamic
бібліотеку, файли заголовків та ресурси.
Static framework
містять static library
упаковку зі своїми ресурсами.
Dynamic framework
містить dynamic library
і ресурси. На додаток до цього, динамічний фреймворк може включати різні версії однієї і тієї ж динамічної бібліотеки в одному пакеті ( versioned bundle
)
[Статичні та динамічні рамки]
Embedded framework
це dynamic framework
живе в пісочниці програми. Цей тип створений насамперед для розширення для спільного використання коду та ресурсів. Він доступний, коли ціль розгортання - iOS 8+.
Umbrella framework
[Сукупна ціль] - це рамка, яка містить інші рамки. Офіційно він не підтримується на iOS, томурозробникам не рекомендується створювати їх [Official doc] . Насправді це набір підкадрів (або вкладених фреймів). Коли ви створюєте рамку, яка має залежність, споживач (наприклад, додаток) несе відповідальність за додавання цієї залежності разом із вашою рамкою до проекту. Як розробник, природно спробувати знайти спосіб перекласти цей обов'язок від споживача до вашого. Як результат, ви вважаєте, щоUmbrella framework
це є порятунком, але зазвичай це призводить до серйозних проблем із керуванням версій та складністю його створення та підтримки.
Fake Framework
- є результатом конкретних операцій в рамках static library
створення пакету з .framework
розширенням, який буде вести себе як a dynamic framework
. Цей метод використовувався, коли Xcode не підтримував створення фреймворку, оскільки не мав шаблону фреймворку. Один із реалізацій підроблених рамок . З Xcode 6 Apple додала підтримку для iOS.
Modular Framework
[About] -@import
це рамка, яка містить.modulemap
файл всередині. Модуль може містити підмодулі. Основна перевага полягає в тому, що ви економите час збиранняModular Framework
.
Universal Library or Framework
(aka Fat) [lipo] [Aggregate target] містить безліч архітектур. Наприклад, ваша версія випуску повинна підтримувати деяку арку, яку ви можете регулювати за допомогою Build Active Architecture Only
[ONLY_ACTIVE_ARCH]
Dependency
[Про] Ви можете використовувати код сторонньої сторони як частину своєї цілі. Це дозволяє повторно використовувати код з багатьох джерел, наприклад - іншого проекту, проекту в тій же робочій області, іншої цілі, бібліотеки, рамки тощо.
Як створити та використовувати Статичну бібліотеку:
Як створити та використовувати динамічний фреймворк [змінити на статичний]
[Система побудови Xcode]
[Компоненти Xcode]
[Динамічний лінкер]