Вызывающий метод для категории, включенной от iPhone статическая библиотека, вызывает NSInvalidArgumentException

Это хороший вопрос, но, на мой взгляд, его следует сформулировать немного иначе, например: «Почему интерпретируемые языки медленнее, чем скомпилированные языки?»

Я думаю, что это интерпретированное понимание медленны сами по себе. Интерпретируемые языки не медленны , но, в зависимости от варианта использования, могут быть медленнее , чем скомпилированная версия. В большинстве случаев интерпретируемые языки на самом деле достаточно быстры !

«достаточно быстры», плюс увеличение производительности от использования языка, такого как Python, например, над C, должно быть достаточным основанием для интерпретируемый язык. Кроме того, вы всегда можете заменить определенные части вашей интерпретируемой программы быстрой реализацией C, если вам действительно нужна скорость. Но опять же, сначала измерьте и определите, действительно ли проблема в скорости, а затем оптимизируйте.

33
задан Corey Floyd 2 October 2009 в 18:36
поделиться

7 ответов

Единственное, что сработало, это включить:

"- all_load"

в других флагах компоновщика.

РЕДАКТИРОВАТЬ: Не забудьте добавить этот флаг в проект, включая статическую библиотеку, а не в саму статическую библиотеку.

Я знаю, что это неправильный метод, но пока он работает.

Возможно, это проблема OS 3.0, так как эта проблема была также решена для Three20.

30
ответ дан 27 November 2019 в 18:12
поделиться

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

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

14
ответ дан 27 November 2019 в 18:12
поделиться

Раньше мне удавалось принудительно связать категорию с помощью -u .objc_category_name_UIView_Extensions, но со средой разработки 3.0, которая не работает, и единственный вариант, кажется, - -all_load.

0
ответ дан 27 November 2019 в 18:12
поделиться

Недавно я столкнулся с этой проблемой. Я не мог заставить -all_load работать, когда заметил, что другая категория, которая у меня была, РАБОТАЕТ. Мне было лень искать эту категорию и я включил ее в другой файл.

В итоге я создал фиктивный класс (без методов, переменных экземпляра) и включил реализацию моих категорий в .m файл для этого фиктивного класса. После этого мои категории начали работать даже после того, как я убрал флаг -all_load.

Это было на iPhone OS 3.1.3.

Это, конечно, не ПРАВИЛЬНЫЙ способ решения проблемы, но, похоже, он сработал.

Полный пример кода находится в моем блоге для моих (тривиальных) категорий.

2
ответ дан 27 November 2019 в 18:12
поделиться

У меня была та же проблема с категориями в моей статической библиотеке. В моем случае «-all_load» не помогло, так как вызвало множество ошибок сборки (моя статическая библиотека является оболочкой для другой частной библиотеки C / C ++).

Я решил это с помощью хака, предложенного на http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html , который просто включал добавление фиктивного (пустого) класса. определение в файлы категорий. Используя этот прием, я сохранил «-ObjC», но сбросил «-all_load» в настройках компоновщика приложений, и он отлично работал на устройстве.

0
ответ дан 27 November 2019 в 18:12
поделиться

Я только что говорил об этом с инженером Apple, и этот вопрос был рассмотрен в ld с версиями> 100. Это включено в XCode4. Он провел меня через это, и я попробовал это сам, и действительно, проблема с категорией решена.

Удалите «-all_load» и вернитесь к «-ObjC» в настройках сборки с новым компоновщиком.

6
ответ дан 27 November 2019 в 18:12
поделиться

Если вы используете Xcode 3.2, вы можете избежать использования -all_load и вместо этого использовать -force_load только для рассматриваемой библиотеки, что должно быть немного более эффективным.

Это описано в недавно обновленном Apple Technical QA: http://developer.apple.com/mac/library/qa/qa2006/qa1490.html

5
ответ дан 27 November 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: