Уточнить категории Objective-C в отдельном файле - PullRequest
1 голос
/ 17 мая 2011

Я добавил несколько методов к существующему классу в движке по категориям. Эта категория объявлена ​​и реализована в моих отдельных файлах. Затем я включаю эти файлы (но все файлы движка остаются неизменными, поэтому в движок включены только оригинальные объявления). Движок встроен в статическую библиотеку и связан с моим приложением. Когда я вызываю метод из моей категории, приложение вылетает с ошибкой «нераспознанный селектор отправлен в экземпляр ...». Но если я объявлю категорию в файле с оригинальным классом движка, все будет работать.

Почему селектор категории не распознается, если он объявлен и реализован в отдельных файлах? Имеет ли значение порядок включения файлов?

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Это ошибка компоновщика, когда методы категорий, объявленные в их собственном модуле компиляции, неправильно связаны в приложении. Смотрите техническое примечание от Apple здесь:

Создание статических библиотек Objective-C с категориями

Вы должны либо указать флаг компоновщика -all_load в своем приложении, либо «хакерский» метод будет определять макрос, который будет определять фиктивный класс и реализацию, и вызывать этот макрос в каждой реализации категории:

#define FIX_CATEGORY_LINKER_BUG(name) \
    @interface FIX_CATEGORY_LINKER_BUG_##name @end \
    @implementation FIX_CATEGORY_LINKER_BUG_##name @end

И используйте его, как указано выше, для реализации вашей категории:

FIX_CATEGORY_LINKER_BUG(NSStringMyAdditions)

@implementation NSString (MyAdditions)
// ...
0 голосов
/ 17 мая 2011

Вам необходимо установить некоторые флаги для компоновщика ... пожалуйста, обратитесь к Что делает флаг компоновщика -all_load? для деталей.

...