+ (void) сообщение о загрузке не отправлено классу платформы во время выполнения устройства - PullRequest
3 голосов
/ 18 мая 2011

Я пролистал здесь вопросы на ТАК, ища какие-либо намеки на то, почему я вижу это поведение, и пока ничего.


Рассмотрим класс (фактически два класса, демонстрирующие одну и ту же проблему), встроенный в статическую библиотеку, обернутый в пакет фреймворка ( используемых шагов ). Они наследуются от базовых фреймворков кластеров классов (NSMutableDictionary и NSMutableArray).

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

Когда проект приложения iOS связывается с этой платформой, существует разница в загрузке классов среды выполнения Objective-C между симулятором и устройством.

В частности, на устройстве (iPhone 4, iOS 4.3.3), когда приложение загружено, эти классы не получают сообщение +load, и статические переменные не инициализируются, поэтому статический метод фабрики завершается ошибкой. На симуляторе сообщения отправляются, и все работает как задумано. Может ли это быть проблема с временем выполнения устройства, имеющего

У меня вопрос, может ли мой фреймворк быть настроен по-другому, чтобы гарантировать отправку сообщений +load? Или я столкнулся с ошибкой при загрузке статического класса библиотеки / фреймворка в iOS?


Классы из библиотеки JSONKit (JKArray, JKDictionary).

Пример проекта, который иллюстрирует эту проблему, здесь - https://github.com/ohhorob/JSONKit-in-framework-demo


РЕДАКТИРОВАТЬ: Согласно предложению @bbum, я проверил, что классы JKDictionary и JKArray фактически загружены и доступны во время работы приложения. Ветвь DeviceBroken в проекте GitHub обновляется с использованием используемой проверки.

Я отправил отчет об ошибке (# 9461567) в Apple.

Ответы [ 2 ]

5 голосов
/ 25 мая 2011

Методы +load не вызываются, поскольку вы фактически не создали статическую библиотеку , а Перемещаемый объектный файл bundle . Если вы создаете статический каркас с шаблоном make-fmwk или iOS Universal Framework , то методы загрузки будут вызываться, как и ожидалось.

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

Odd; Я бы сделал NSLog(@"klassy klass %@", [MysteryClass class]); и убедился, что классы действительно загружены (но смотрите ниже - это может «решить» проблему).

Если это так, то это ошибка в загрузчике DYLD, и, пожалуйста, отправьте ее.

Если нет, то, вероятно, компоновщик удаляет класс (ы), потому что ничто не ссылается на них напрямую. Попробуйте добавить [MysteryClass class] в метод приложения applicationDidFinishLaunching: (на самом деле не имеет значения, где и даже, если он будет выполнен ... но это будет очевидное место).

Кроме того, я бы предложил не использовать +load и вместо этого писать функцию конструктора. I.e.:

__attribute__((constructor))
static void initLibrary()
{
    ....
}

Если это проблема компоновщика, это может или не может решить проблему. Это, однако, гораздо яснее в ваших намерениях, чем довольно волшебный +load метод.

...