О загружаемых пакетах
Загружаемые пакеты являются пакетами исполняемого кода и связанных ресурсов, которые могут быть загружены во время выполнения. Эта гибкость позволяет Вам разрабатывать очень модульные, настраиваемые, и расширяемые приложения. После чтения этого документа Вы поймете, как структурированы загружаемые пакеты и когда необходимо использовать их.
Введение в загружаемые пакеты
OS X использует структуру каталогов, вызвал пакет по всей системе для упаковки исполняемого кода и связал ресурсы. Каталог пакета, в сущности, «связывает» ряд ресурсов в дискретном пакете. Ресурсы включают такие вещи как Интерфейсные файлы пера Разработчика, изображения, звуки и локализованные символьные строки. Поскольку код и связанные ресурсы находятся в одном месте в файловой системе, установке, удалении, и другие формы управления программным обеспечением проще.
Пакеты прибывают в несколько вариантов: приложения, платформы и загружаемые пакеты. Этот документ имеет дело в частности с загружаемыми пакетами, содержащими код, который может быть загружен во время выполнения, освободив Вас от многих ограничений статической компиляции. Проектирование Вашего приложения вокруг загружаемых пакетов предоставляет Вам много преимуществ:
Можно задержать загружающийся код, пока он не необходим, и в некоторых случаях разгрузите код, когда он больше не необходим.
Можно разделить приложение на части, которые могут быть скомпилированы независимо, позволив Вам более легко разделить техническую разработку и протестировать различные версии различных компонентов друг с другом.
Можно подать заявку, расширяемую путем разработки сменной архитектуры. Таким образом, Вы или сторонние разработчики можете легко добавить новые опции, не перекомпилировав целое приложение или даже имея доступ к его исходному коду.
Разгрузка ограничивается приложениями, не использующими среду выполнения Какао. Во время этой записи время выполнения Objective C не поддерживает разгрузку символов Objective C, таким образом, не может быть разгружено Какао пакеты, когда-то загруженные.
OS X определяет расширение .bundle
идентифицировать загружаемые пакеты. Можно также определить собственное расширение (и связанный значок) для определенного типа пакета.
Расширения ядра являются типом загружаемого пакета, который системные подпрограммы пакета распознают и обрабатывают соответственно (несмотря на то, что их внутренняя структура отличается от других загружаемых пакетов). Эти пакеты имеют расширение .kext
. Менеджер по Ядру, требующий расширений ядра как типа документа, динамично загружает их в среду ядра. Этот документ не имеет дело с расширениями ядра далее. Для узнавания больше см. Дарвинскую Документацию.
Для получения дополнительной информации о пакетах, см. Руководство по программированию Пакета. Для получения дальнейшей информации о том, как OS X загружает и выполняет код, посмотрите OS X ABI Мужественная Ссылка Формата файла.
Когда использовать загружаемые пакеты
Существенно, загружаемые пакеты позволяют Вам загрузить код и связать символы во время выполнения. На практике они могут помочь Вам удовлетворить три связанных потребностей:
Задержанное («ленивое») соединение и загрузка
Модульный принцип компонентов кода
Расширяемость приложения
Ленивое соединение и загрузка
Большие, сложные приложения выполняют множество задач. Обычно, пользователь не должен выполнять все доступные задачи в данном сеансе использования. Это означает, что блоки кода приложения, иногда значительных частей, загружаются в память, но никогда не используются.
Можно избежать ненужной загрузки кода путем разделения приложения в загружаемые пакеты, состоящие из логически связанного кода. Также включая функции средства доступа или методы для этих частей кода, можно беспрепятственно сослаться на объекты, непосредственно не проверяя, был ли код загружен или не — эти проверки имеют место неявно в методах доступа.
Ленивая загрузка может принять иерархическую форму с частями крупного приложения на верхнем уровне и более определенных функциях ниже. Определенные функции обычно принимают форму плагинов, как описано в Расширяемости Приложения.
Модульный принцип кода
Существует несколько способов построить Ваше приложение из модулей в логически отдельные компоненты кода. Основной способ построить Ваш код из модулей состоит в том, чтобы разделить его на многократные исходные файлы — все нетривиальные приложения создаются этот путь. Следующий уровень сложности является платформой, содержащей исполняемый код, заголовки, и возможно другие ресурсы в пакете каталога. С небольшой дополнительной работой можно также использовать загружаемые пакеты в качестве модуля модульного принципа.
Несмотря на то, что не каждая ситуация требует модуляризацию через загружаемые пакеты, Вы получаете много выгоды путем включения дополнительной работы. Когда кодовая база разделяется на многократные пакеты, каждый пакет может быть разработан и протестирован независимо от других до еще большей степени, чем платформы. Поскольку пакет содержит динамично загруженный исполняемый код, другие части приложения могут быть агностиком функциональных адресов, объектных адресов, и даже какой класс ссылочный объект принадлежит, пока это знает достаточно о классе для использования его. Различные версии различных компонентов кода могут быть протестированы, не перекомпилировав приложение — можно объединить различные компоненты только путем перетаскивания значков в Средстве поиска.
Расширяемость приложения
Большая часть использования загружаемых пакетов является результатом потребности в расширяемости приложения. Можно определить сменную архитектуру, если Вы хотите, чтобы Ваше приложение было расширяемо, или внутренне в Вашей организации или сторонними разработчиками. Сменная архитектура определяет интерфейс, через который должным образом созданный загружаемый пакет, названный плагином, может добавить функциональность. Примерами плагинов являются модули экранной заставки, предпочтительные области, палитры Interface Builder, графические фильтры Adobe Photoshop и музыка iTunes visualizers.
Вещи иметь в виду
Используя загружаемые пакеты не прибывает «бесплатно», несмотря на то, что и Какао и Базовая Основа предоставляют богатую поддержку API в этом отношении. При попытке решить, использовать ли загружаемые пакеты, иметь в виду следующие затраты:
Во время выполнения должны быть явно загружены загружаемые пакеты, в отличие от комплектов приложений и платформ. Если необходимо кодировать возможность многократного использования, но не динамическую загрузку, платформы часто являются лучшим выбором.
В Какао загружаемые пакеты не могут использоваться в качестве схемы управления памятью значительных частей кода, потому что не могут быть разгружены пакеты Какао.
Определение сменной архитектуры требует тщательной проверки сменных модулей.
Разрешение внешнего сменного кода в Вашем приложении идет с устойчивостью и проблемами безопасности.
Однако, если Ваши потребности приложения задержанная загрузка, более динамический модульный принцип, чем платформы может обеспечить, или расширяемость, используйте загружаемые пакеты.
Анатомия загружаемого пакета
Каталог пакета содержит иерархию ресурсов и исполняемого кода, каждого в его надлежащем месте. Типичная иерархия каталогов пакета похожа на Перечисление 1.
Перечисление 1 расположение каталога типичного загружаемого пакета
- MyLoadableBundle |
Contents/ |
Info.plist |
MacOS/ |
MyLoadableBundle |
Resources/ |
Lizard.jpg |
MyLoadableBundle.icns |
English.lproj/ |
MyLoadableBundle.nib |
InfoPlist.strings |
Japanese.lproj/ |
MyLoadableBundle.nib |
InfoPlist.strings |
Каждый каталог пакета содержит один элемент, Contents
каталог. Contents
содержит два настоящие файлов в каждом пакете, Info.plist
и PkgInfo
, а также MacOS
каталог, содержащий исполняемый код, и Resources
каталог, содержащий все ресурсы некода. Более сложные пакеты могут содержать дополнительные каталоги такой как Frameworks
, PlugIns
, SharedFrameworks
, и SharedSupport
— все функции поддерживаются законченными пакетами приложений.
Info.plist
файл или информационный список свойств, является списком свойств XML, содержащим пары ключ/значение информации о пакете. Системные подпрограммы позволяют исполнимой программе пакета читать эти атрибуты во время выполнения. Вы свободны хранить любые определенные с помощью приложения данные в информационном списке свойств также. XCode обеспечивает пользовательский интерфейс для редактирования информационных списков свойств и включает все требуемые ключи по умолчанию.
Информационные ключи списка свойств могут быть локализованы путем добавления соответствующих записей в InfoPlist.strings
файлы, содержавшиеся в каталогах языка (такой как Japanese.lproj
) в Resources
каталог.
Ключи списка свойств наиболее релевантной информации для загружаемых пакетов:
CFBundleExecutable
: имя исполнимой программы, обычно то же как каталог пакета без расширенияCFBundleIdentifier
: глобально уникальный идентификатор для пакета, в порядке обратного DNS, такой какcom.apple.screensaver.Flurry
CFBundleName
: короткое имя дисплея пакета, используемого в качестве человекочитаемого идентификатора (должен быть локализован),CFBundleDisplayName
: имя дисплея пакета, используемого для представления пакета в Средстве поиска, если не переопределено пользователем (должен быть локализован),
Для полного описания всего стандарта Info.plist
ключи, посмотрите Ключевую Ссылку Списка свойств.
MacOS
каталог содержит Мужественный исполняемый код для загружаемого пакета. Имя исполнимой программы в этом каталоге обычно является тем же как каталогом пакета без его расширения и совпадает со значением для CFBundleExecutable
введите информационный список свойств. Определенные типы пакетов могут испытать недостаток в исполняемом коде. Загружаемым пакетам, приложениям, и большинству других типов пакетов, однако, нужен он по их характеру.
Resources
каталог содержит все ресурсы, связанные с пакетом, такие как звуки, изображения, Интерфейсные файлы пера Разработчика и локализованные строки. Локализованные ресурсы содержатся в языке.lproj
каталоги. Можно создать подкаталоги в Resources
организовывать типы ресурсов, если Вам нравится.
Для более подробной информации об информационных списках свойств посмотрите информационные Списки свойств.