Objective-C не имеет пространств имен; это очень похоже на C, все находится в одном глобальном пространстве имен. Обычная практика - ставить классы с инициалами, например, если вы работаете в IBM, вы можете добавить к ним префикс «IBM»; если вы работаете в Microsoft, вы можете использовать «MS»; и так далее. Иногда инициалы относятся к проекту, например, классы префиксов Adium с "AI" (так как нет никакой компании, которую вы могли бы взять инициалы). Apple префиксирует классы с NS и говорит, что этот префикс зарезервирован только для Apple.
Пока все хорошо. Но добавление от 2 до 4 букв к имени класса впереди - очень, очень ограниченное пространство имен. Например, MS или AI могут иметь совершенно разные значения (например, AI может быть искусственным интеллектом), и некоторые другие разработчики могут решить использовать их и создать класс с одинаковым именем. Взрыв , столкновение пространства имен.
Хорошо, если это коллизия между одним из ваших собственных классов и одним из используемых вами внешних фреймворков, вы можете легко изменить наименование вашего класса, не беда. Но что, если вы используете две внешние платформы, обе из которых у вас нет источника и которые вы не можете изменить? Ваше приложение связывается с ними обоими, и вы получаете конфликты имен. Как бы вы решили это? Каков наилучший способ обойти их таким образом, чтобы вы все еще могли использовать оба класса?
В C вы можете обойти это, не связываясь напрямую с библиотекой, вместо этого вы загружаете библиотеку во время выполнения, используя dlopen (), затем находите искомый символ с помощью dlsym () и назначаете его глобальному символу (который вы можно назвать как угодно, а затем получить к нему доступ через этот глобальный символ. Например, если у вас есть конфликт, потому что в какой-то библиотеке C есть функция с именем open (), вы можете определить переменную с именем myOpen и указать ей функцию open () библиотеки, таким образом, когда вы хотите использовать систему open () , вы просто используете open (), и когда вы хотите использовать другой, вы получаете доступ к нему через идентификатор myOpen.
Возможно ли что-то подобное в Objective-C, и если нет, есть ли какое-нибудь другое умное, хитрое решение, которое вы можете использовать для разрешения конфликтов пространства имен? Любые идеи?
Обновить:
Просто чтобы прояснить это: ответы, которые предлагают, как избежать конфликтов пространства имен заранее или как создать лучшее пространство имен, безусловно, приветствуются; однако я не приму их в качестве ответа, поскольку они не решают мою проблему. У меня есть две библиотеки, и их имена классов сталкиваются. Я не могу их изменить; У меня нет источника ни того, ни другого. Столкновение уже произошло, и советы о том, как его можно было избежать заранее, больше не помогут. Я могу направить их разработчикам этих фреймворков и надеюсь, что в будущем они выберут лучшее пространство имен, но пока я ищу решение для работы с фреймворками прямо сейчас в одном приложении. Какие-нибудь решения, чтобы сделать это возможным?