Co robi flaga konsolidatora -all_load?

123

Nie mogę znaleźć nigdzie, co robi flaga -all_load podczas kompilowania kodu Objective-C.

Mam pewne problemy z przesyłaniem plików binarnych do Apple, mówią, że to dlatego, że nie użyłem tej flagi, ale mój kod kompiluje się nawet bez niej.

Czy ktoś może mi w tym pomóc?

Dzięki

Guy Ephraim
źródło
2
Zwykle wszelkie wyświetlane błędy występują na urządzeniu podczas uruchamiania aplikacji. Czy twierdzisz, że nie przetestowałeś swojej aplikacji na rzeczywistym sprzęcie przed przesłaniem do recenzji przez Apple? Jeśli tak, to bardzo, bardzo zły pomysł.
Brad Larson
Przetestowałem to, ale moja konfiguracja „dystrybucji” - ta z profilem aprowizacji sklepu z aplikacjami - nie miała flagi i wszystkie testy zostały wykonane przy użyciu profilu deweloperskiego, który miał tę flagę, więc wszystko wydaje się w porządku, a kiedy Skompilowałem go dla sklepu z aplikacjami z profilem dystrybucji flaga była wyłączona, a ponieważ profilu dystrybucji nie można zainstalować lokalnie, nie mogłem go sprawdzić.
Guy Ephraim

Odpowiedzi:

144

Jest to prawdopodobnie związane z tą uwagą techniczną https://developer.apple.com/library/content/qa/qa1490/_index.html

WAŻNE: W przypadku aplikacji 64-bitowych i aplikacji na system iPhone OS istnieje błąd konsolidatora, który uniemożliwia -ObjC ładowanie plików obiektów z bibliotek statycznych, które zawierają tylko kategorie i nie zawierają klas. Obejściem problemu jest użycie flag -all_load lub -force_load. -all_load wymusza na konsolidatorze załadowanie wszystkich plików obiektowych z każdego archiwum, które widzi, nawet tych bez kodu Objective-C. -force_load jest dostępny w Xcode 3.2 i nowszych. Pozwala na dokładniejszą kontrolę ziarna podczas ładowania archiwum. Po każdej opcji -force_load musi następować ścieżka do archiwum, a każdy plik obiektowy w tym archiwum zostanie załadowany.

Sharjeel Aziz
źródło
3
Tak, dotyczy to przede wszystkim bibliotek statycznych dla iPhone'a. Jeśli zostaną skompilowane bez tej flagi konsolidatora, kategorie nie zostaną uwzględnione w skompilowanym pliku binarnym, a każda aplikacja korzystająca z tych bibliotek statycznych będzie miała błędy w czasie wykonywania podczas wykonywania na sprzęcie z systemem operacyjnym iPhone.
Brad Larson
1
czy w czasie kompilacji nie powinno być żadnych ostrzeżeń lub błędów dotyczących brakującej metody?
Guy Ephraim
18
Nie, ponieważ kategorie istnieją w czasie kompilacji, po prostu nie są łączone z ostatecznym plikiem binarnym. Jednak ze względu na dynamiczną naturę wysyłek Obj-C linker nie wskazuje wywołania kodu bezpośrednio do metody implementującej, więc nigdy nie zauważa, że ​​go brakuje. Następnie w czasie wykonywania otrzymujesz kaboom, tak samo, jak gdybyś wywołał go za pomocą „-performSelector:”
Sophistifunk
14
Chcę tylko wyjaśnić uwagę techniczną: w większości przypadków będziesz potrzebować flagi konsolidatora -ObjC, a nie -all_load. -all_load jest zalecane w (zakładałbym rzadkiej) instancji, w której masz bibliotekę bez klas, tylko kategorie.
Chris Hill
3
Według stackoverflow.com/a/2615407/62 zostało to naprawione od XCode 4.2, więc nie potrzebujesz już flag -all_load lub -force_load. Nadal potrzebujesz -ObjC.
Liron Yahdav