Що робить прапор зв’язку -all_load?


123

Я не можу ніде знайти, що робить прапор -all_load при компілюванні коду Objective-C.

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

Може хтось мені в цьому допоможе?

Дякую


2
Зазвичай будь-які помилки, які ви бачите з цим, трапляються на пристрої під час роботи програми. Ви хочете сказати, що ви не перевіряли свою заявку на фактичному обладнанні перед тим, як подати на розгляд Apple? Якщо так, то це дуже-дуже погана ідея.
Бред Ларсон

Я перевірив це, однак у моїй конфігурації "розповсюдження" - у тій, що має профіль надання магазину додатків - не було прапора, і всі тести були виконані за допомогою профілю розробки, у якого був прапор, і все, здається, добре, і коли Я скомпілював це для магазину додатків із профілем розповсюдження, прапор був вимкнений, і оскільки профіль розповсюдження не можна встановити локально, я не міг його перевірити.
Гай Єфрем

Відповіді:


144

Ймовірно, це стосується цієї технічної записки https://developer.apple.com/library/content/qa/qa1490/_index.html

ВАЖЛИВО: Для 64-розрядної програми та додатків для ОС iPhone існує помилка лінкера, яка не дозволяє -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.
Лірон Ягдав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.