Что делает флаг компоновщика -all_load?

123

Я нигде не могу найти, что делает флаг -all_load при компиляции кода Objective-C.

У меня есть некоторые проблемы с загрузкой двоичных файлов в Apple, они говорят, что это потому, что я не использовал этот флаг, но мой код компилируется даже без него.

Кто-нибудь может мне с этим помочь?

Спасибо

Гай Ефрем
источник
2
Как правило, любые ошибки, которые вы видите при этом, возникают на устройстве при запуске приложения. Вы хотите сказать, что не тестировали свое приложение на реальном оборудовании перед отправкой на рассмотрение Apple? Если так, то это очень и очень плохая идея.
Брэд Ларсон
Я тестировал его, однако моя конфигурация «распределения» - та, что с профилем обеспечения магазина приложений - не имела флага, и все тесты проводились с использованием профиля разработки, в котором был флаг, поэтому все выглядит нормально, и когда Я скомпилировал его для магазина приложений с профилем распространения, флаг был отключен, и, поскольку профиль распространения не может быть установлен локально, я не мог его проверить.
Гай Ефрем,

Ответы:

144

Вероятно, это связано с этой технической записью https://developer.apple.com/library/content/qa/qa1490/_index.html.

ВАЖНО: для 64-битных приложений и приложений для iPhone OS существует ошибка компоновщика, которая не позволяет -ObjC загружать файлы объектов из статических библиотек, которые содержат только категории и не содержат классов. Обходной путь - использовать флаги -all_load или -force_load. -all_load заставляет компоновщик загружать все объектные файлы из каждого архива, который он видит, даже без кода Objective-C. -force_load доступен в Xcode 3.2 и новее. Это позволяет более точно контролировать загрузку архива. За каждой опцией -force_load должен следовать путь к архиву, и каждый объектный файл в этом архиве будет загружен.

Шарджил Азиз
источник
3
Да, в первую очередь это касается статических библиотек для iPhone. Если они скомпилированы без этого флага компоновщика, категории не включаются во встроенный двоичный файл, и любое приложение, использующее эти статические библиотеки, будет иметь ошибки времени выполнения при выполнении на оборудовании iPhone OS.
Брэд Ларсон
1
не должны ли быть какие-то предупреждения или ошибки отсутствующего метода во время компиляции?
Гай Ефрем,
18
Нет, поскольку категории существуют во время компиляции, они просто не связаны в окончательный двоичный файл. Но из-за динамического характера диспетчеризации Obj-C компоновщик не указывает вызывающий код напрямую на реализующий метод, поэтому он никогда не замечает, что он отсутствует. Затем во время выполнения вы получаете рабочий стол, как если бы вы вызвали его с помощью «-performSelector:»
Sophistifunk
14
Просто хочу прояснить техническое примечание: в большинстве случаев вам понадобится флаг компоновщика -ObjC, а не -all_load. -all_load рекомендуется в том случае (я бы предположил редко), когда у вас есть библиотека без классов, только категории.
Крис Хилл
3
Согласно stackoverflow.com/a/2615407/62, это было исправлено в XCode 4.2, поэтому вам больше не нужны флаги -all_load или -force_load. Вам все еще нужен -ObjC.
Лирон Яхдав