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