2012-05-04 1 views
12

Я использую стороннее программное обеспечение для написания приложения iPad с использованием Xcode 4.3.2. Программное обеспечение является открытым исходным кодом и обычно устанавливается таким образом, что его код будет скомпилирован вместе с любым кодом, который разработчик пишет для приложения. Поскольку я использовал программное обеспечение во многих местах, я решил создать его как статическую библиотеку для iOS-симулятора.Метод непризнанной категории вызова вызывающего абонента в статической библиотеке iOS

Мне удалось создать библиотеку и преобразовать одно приложение для связи с этой библиотекой вместо компиляции исходного исходного кода. Однако, когда я иду запускать приложение на симуляторе, я получаю сообщение об ошибке: нераспознанный селектор отправлен в экземпляр.

Я проверил, что программа успешно использует части статической библиотеки. Тем не менее, есть одна часть кода, которая пытается вызвать метод для объекта и что там происходит сбой. Вызываемый метод на самом деле не определен в интерфейсе этого объекта. Скорее, он предоставляется в дополнительном модуле, который определяет категорию для этого класса объекта. Заголовочный файл для этого модуля должным образом включен, и компилятор должен был найти метод категории и применить его к объекту, но во время выполнения возникает ошибка, упомянутая выше.

Я использовал команду «nm», чтобы убедиться, что метод категории существует в статической библиотеке. Вот пример вывода:

nm libStaticLibrary.a | grep categoryMethod 
00000130 t -[SomeClass(Category) categoryMethod:] 
0000354c s -[SomeClass(Category) categoryMethod:].eh 

Какие идеи у людей о том, как эта библиотека может быть сделано правильно работать с нужным приложением?

+3

Добавить -ObjC флаг компоновщика, как описано здесь: HTTP: // StackOverflow .com/questions/2567498/object-c-categories-in-static-library –

+0

-load_all также работает. – CodaFi

+0

Возможный дубликат [ссылки объективных категорий c в статической библиотеке] (http://stackoverflow.com/questions/6820778/linking-objective-c-categories-in-a-static-library) –

ответ

24

Возможно, ваша сторонняя структура может быть использована в категории существующих классов (apple). Но чтобы загрузить/найти категорию, которую нужно добавить -ObjC флаг в настройках сборки под Other Linker Flags

buildsettings

+1

Inlcude -Objc как флаг компоновщика сделал трюк. Благодарю. –

+2

Это должно быть установлено в настройках компоновщика для цели, используя библиотеку, а не в самой библиотеке. – Krejko

+1

Помните, что это -ObjC и не -Objc –

3

Pfitz ответ велик, но это заставит компилятор загрузить кучу неиспользуемых двоичных файлов для вашего проекта который не то, что вы хотите. Пожалуйста, обратитесь к этому ответу, чтобы узнать, почему https://stackoverflow.com/a/22264650/1363997

Вот лучшее решение:

1) выберите проект цели из левой панели (эти папки навигатор)
2) выберите «Build Phases» кран
3) расширить «Источники Compile» клетки
4) нажать кнопку плюс в нижней части, а затем добавить .m файл вашей категории в

Сделано!

Примечание: вы должны найти файл, перейдя через папку по вашей собственной личности, не вводите имя файла в поле поиска

+1

Разве это не просто эффективно копирует файл .m в проект, в первую очередь лишая место инкапсуляции кода в статическую библиотеку? – devios1

+0

У меня уже был флаг -ObjC, и -load_all тоже не решил проблему. Так оно и было. Благодарю. –