Я пока не нашел ничего, что решало бы мой конкретный вопрос о пространстве имен.
Я работаю над некоторыми плагинами AudioUnit с графическим интерфейсом на основе Какао. Плагины используют общую библиотеку классов пользовательского интерфейса (ползунки, кнопки и т. Д.), Которые просто добавляются в каждый проект Xcode.
Когда я перекомпилирую и распространяю обновления, в значительной степени гарантируется, что по крайней мере один класс пользовательского интерфейса будет обновлен с момента последнего выпуска. Если пользователь запускает старый плагин перед обновленным плагином, тогда старые классы Какао уже загружены во время выполнения, и плагин пытается использовать более старые реализации, что часто приводит к сбою так или иначе.
Я знаю, что фреймворки - это намеченное решение, но проблемы с издержками и обратной совместимостью не идеальны. Я префикс всех имен классов, где это возможно, но какие параметры я должен обеспечить, чтобы каждый плагин содержал уникальные имена классов для классов общего пользовательского интерфейса?
Обновление:
Решение, к которому я, похоже, пришел, заключается в следующем:
Установить флаг компилятора препроцессора, например OBJC_PREFIX=1
.
Создайте файл заголовка, который будет содержать все переопределения имен классов, и условно включите его в заголовок каждого класса, который вы хотите «переименовать», например:
#ifdef OBJC_PREFIX
#include "CocoaPrefixHeader.h"
#endif
@interface MySlider : ... etc
Заполните файл заголовка (в данном случае CocoaPrefixHeader) примерно так:
#define MySlider Prefix_MySlider
#define MyButton Prefix_MyButton
Используя ibtool, преобразуйте все имена ваших классов в существующем файле nib / xib в новые имена, например:
ibtool --convert MySlider-Prefix_MySlider nibfile.xib --write nibfile2.xib
ibtool --convert MyButton-Prefix_MyButton nibfile2.xib --write nibfile2.xib
Этот последний шаг преобразует все имена классов, выходы и т. Д. В файл пера. После преобразования вы можете редактировать перо как обычно, а IB отслеживает переопределенные имена.
Этот процесс утомителен и кропотлив, но он работает для меня . Намного лучше обслужить это с самого начала.