Я был в этой лодке и раньше, и это не очень хорошая лодка. Я потратил много времени, вкладывая средства в лучший из возможных способов избежать столкновения имен классов во время выполнения. Решение было:
Создайте сценарий предварительной сборки, который анализирует все объявления @interface
в заголовочных файлах и собирает все имена классов. Этот скрипт генерирует новый заголовок, который содержит что-то вроде следующего:
#define MyClass MyClass_Target
#define MyOtherClass MyOtherClass_Target
#define MyThirdClass MyThirdClass_Target
(очевидно, суффикс _Target
устанавливается параметром сборки, который ваш сценарий предварительной сборки может просматривать и использовать).
Сценарий может быть скриптом Perl или Python, который просто сканирует каждый *.h
файл, извлекая слово после @interface
.
Сконфигурируйте сборку для автоматического включения сгенерированного файла заголовка, чтобы вам не приходилось вручную включать сгенерированный заголовок в каждый исходный файл.
Если ваши связки имеют перья, это добавляет дополнительный уровень сложности, но это все еще можно сделать. Создайте другой сценарий, который заменит существующий & ldquo; Nib Compiler & rdquo ;. Эта программа в основном выполняет то же переименование классов, но для перьев (это достаточно просто, потому что файлы перьев являются XML). Я не могу вспомнить, где его установить, но в XCode есть место, которое позволяет вам выбирать, как файлы Nib & ldquo; скомпилированы & rdquo ;. Ваш скрипт компилятора пера - это в основном оболочка, которая переименовывает классы в пирах, а затем вызывает реальный компилятор пера (который вы можете узнать, как он вызывается, посмотрев журнал сборки).
Это работает?
Да, и это работает на удивление хорошо, даже в ситуациях отладки. Когда вы достигаете точки останова, Xcode отображает имя класса с целевым суффиксом , чтобы вы знали, в каком пакете вы находитесь, несмотря на то, что исходный код показывает что-то другое. & ldquo; Исправить и продолжить & rdquo; все еще работал, насколько я помню.
Кроме того, поскольку переименование класса выполняется незадолго до времени компиляции, оно не влияет на такие вещи, как управление версиями исходного кода, взаимодействие с Interface Builder и т. Д.
Вопросы
Динамически сгенерированные имена классов не будут работать, например, Class
объекты, возвращаемые из NSClassFromString
, если в коде не указан необходимый суффикс.
Такая сложная установка требует небольшого обслуживания. После того, как я его запустил, он работал хорошо для наших нужд, но время от времени ему нужно было настроить его, чтобы он работал гладко.