Связывание категорий objective-c в статической библиотеке

Я разрабатываю плагин для приложения iOS. Я компилирую его в файл .a, который затем используется главным проектом xcode.

До сих пор я создал категорию класса UIDevice в этой библиотеке. Когда я запускаю основной проект с использованием этой библиотеки, он сбой из-за непризнанного селектора

- [UIDevice platform]: непризнанный селектор, отправленный в экземпляр

Платформа

- одно из тех явлений, которые я добавил через категорию.

Итак, я думал, что это вообще не связывает эти функции и добавляет функцию c в тот же файл, что и категория UIDevice, после чего вызывается из моего кода.

На этот раз основной проект прошел отлично... Поэтому я подумал, что, возможно, это было что-то еще, что я сделал, и удалил функцию C. Но вот и он снова рухнул из-за непризнанного селектора.

Мои вопросы: Почему xcode игнорирует определение категории, если я не вызываю функцию, объявленную в том же файле?

Есть ли параметр xcode, который я могу изменить, чтобы включить эти методы из категории UIDevice, независимо от того, вызываю ли я функцию из этого файла или нет?

веселит

Ответ 1

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

Objective-C не определяет символы линкера для каждой функции (или метод, в Objective-C) - вместо этого символы компоновщика генерируются только для каждого класса. Если вы расширите существующий класс с помощью категорий, компоновщик не знает, чтобы связать объектный код ядра класса и реализации категории. Это предотвращает объекты, созданные в полученном приложении, от ответа на селектор, который определен в категории.

Чтобы устранить эту проблему, целевая ссылка на статическую библиотеку должен передать опцию -ObjC для компоновщика. Этот флаг вызывает компоновщик для загрузки каждого объектного файла в библиотеке, который определяет Objective-Cкласса или категории. Хотя этот параметр обычно приводит к увеличению исполняемый файл (из-за дополнительного объектного кода, загруженного в приложение), это позволит успешно создать эффективные Objective-C статические библиотеки, содержащие категории в существующих классы.


Важно. Для приложений с 64-разрядной и iPhone-ОС существует ошибка компоновщика, которая предотвращает -ObjC от загрузки файлов объектов из статического библиотеки, содержащие только категории и классы. Обходной путь - использовать флаги -all_load или -force_load.

Источник: @albertamg (привязка категорий Objective-C в статической библиотеке)

Ответ 2

У меня была та же проблема. Метод, определенный в категории, определенной в подпроекте, привел к исключению непризнанного исключения. (Фактически это проявляется в неспособности указать подкласс UILabel в Interface Builder, в XIB содержится класс, показанный в IB (UILabel или UIView, в зависимости от того, что я там перетаскивал), а не класс, который я набрал, и что выглядела как странная ошибка XCode.)

Решение, которое сработало для меня, состояло в использовании -force_load:

В левой панели выберите основной проект (корневой элемент). Справа вы увидите PROJECT и TARGETS. Выберите TARGETS. Перейдите в "Настройки сборки" (в верхней строке) - "Связывание" - "Другие флаги компоновщика" и, если ваш подпроект называется XXXXX, добавьте -force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a там (элемент имеет два подэлемента, Debug и Release, но вы нажимаете на этот составной элемент, чтобы он влиял как на Debug, так и на Release).

Обратите внимание, что -force_load работает для одной библиотеки, и вам может потребоваться указать отдельную -force_load для каждой библиотеки подпроектов.

Ответ 3

У меня была эта проблема, и я потратил около 1 часа на ее решение. Слава Богу! это было сделано. Методы, которые определены, должны быть статическими!