Предотвращение конфликтов имен

Поскольку время выполнения Objective C использует плоское пространство имен, необходимо быть осторожными при разработке плагина для не выбора имени, конфликтующего с кодом приложения или другим плагином, загруженным приложением. В этом разделе описывается назвать Ваши классы и другие символы для предотвращения этого вида конфликта.

Время выполнения Objective C обеспечивает только единственное плоское, глобальное пространство имен для каждого процесса для всех экспортируемых символов. Это включает все глобальные переменные, нестатические функции, имена классов и категории, объявленные для отдельных классов; протоколы имеют отдельное собственное глобальное пространство имен.

Поскольку плагины от различных поставщиков должны сосуществовать в том же процессе, необходимо следовать соглашениям избежать коллизий имени символа. Каждый экспортируемый символ в плагине должен быть снабжен префиксом идентификатор, уникальный для плагина. Это требование не обходится путем разгрузки каждого плагина прежде, чем загрузить следующий. Как только символ Objective C (имена классов, протоколы и категории) загружается, он не может быть разгружен.

Алгоритм уникальности

Ваш плагин должен получить свой уникальный префикс из его идентификатора пакета с помощью следующего алгоритма:

  1. Запустите с идентификатора пакета (com.apple.preference.sound)

  2. Капитализируйте первую букву каждого разделенного от периода компонента (Com.Apple.Preference.Sound)

  3. Удалите периоды (ComApplePreferenceSound)

Обратите внимание на то, что это соглашение зависит от уникальности каждого идентификатора пакета. Для гарантии уникальности идентификатора пакета каждая организация должна снабдить префиксом свои идентификаторы ее упорядоченное реверсом доменное имя ICANN (например, com.apple).

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

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

#define SoundPref ComApplePreferenceSoundPref
#define AlertController ComApplePreferenceSoundAlertController
#define MicrophoneController ComApplePreferenceSoundMicrophoneController

Эти ярлыки только допустимы в исходных файлах Objective C, включающих заголовочный файл. Ссылки на имена классов за пределами таких исходных файлов (например, в списке свойств пакета и в основном файле пера) должны указать полное, настоящее имя.

Категории

Плагины должны избегать использования категорий Objective C к переопределенным методам классов в общедоступных платформах. Если многократные плагины пытаются переопределить тот же метод того же класса, только одно переопределение вступает в силу, приводя к непредсказуемому поведению.