Que fait l'indicateur de l'éditeur de liens -all_load?

123

Je ne trouve nulle part ce que fait l'indicateur -all_load lors de la compilation du code Objective-C.

J'ai des problèmes pour télécharger des binaires sur Apple, ils disent que c'est parce que je n'ai pas utilisé cet indicateur, mais mon code se compile même sans lui.

Quelqu'un peut-il m'aider avec ça?

Merci

Guy Ephraim
la source
2
En règle générale, toutes les erreurs que vous voyez avec cela se produisent sur l'appareil lors de l'exécution de l'application. Êtes-vous en train de dire que vous n'avez pas testé votre application sur du matériel réel avant de la soumettre pour examen par Apple? Si c'est le cas, c'est une très, très mauvaise idée.
Brad Larson
Je l'ai testé, mais ma configuration de «distribution» - celle avec le profil de provisionnement de l'App Store - n'avait pas le drapeau et tous les tests ont été effectués en utilisant le profil de développement qui avait le drapeau donc tout semble correct, et quand Je l'ai compilé pour l'App Store avec le profil de distribution, l'indicateur était désactivé, et comme le profil de distribution ne peut pas être installé localement, je n'ai pas pu le vérifier.
Guy Ephraim

Réponses:

144

Elle est probablement liée à cette note technique https://developer.apple.com/library/content/qa/qa1490/_index.html

IMPORTANT: pour les applications 64 bits et iPhone OS, il existe un bogue de l'éditeur de liens qui empêche -ObjC de charger des fichiers d'objets à partir de bibliothèques statiques qui ne contiennent que des catégories et aucune classe. La solution de contournement consiste à utiliser les indicateurs -all_load ou -force_load. -all_load force l'éditeur de liens à charger tous les fichiers objets de chaque archive qu'il voit, même ceux sans code Objective-C. -force_load est disponible dans Xcode 3.2 et versions ultérieures. Il permet un contrôle plus fin du chargement des archives. Chaque option -force_load doit être suivie d'un chemin vers une archive, et chaque fichier objet de cette archive sera chargé.

Sharjeel Aziz
la source
3
Oui, cela entre principalement en jeu avec les bibliothèques statiques pour l'iPhone. S'ils sont compilés sans cet indicateur de l'éditeur de liens, les catégories ne sont pas incluses dans le binaire construit et toute application utilisant ces bibliothèques statiques aura des erreurs d'exécution lorsqu'elle sera exécutée sur du matériel iPhone OS.
Brad Larson
1
ne devrait-il pas y avoir des avertissements ou des erreurs de la méthode manquante au moment de la compilation?
Guy Ephraim
18
Non, parce que les catégories existent au moment de la compilation, elles ne sont tout simplement pas liées au binaire final. Mais en raison de la nature dynamique des distributions Obj-C, l'éditeur de liens ne pointe pas l'appel de code directement vers la méthode d'implémentation, donc il ne remarque jamais qu'il manque. Ensuite, au moment de l'exécution, vous obtenez le kaboom, comme si vous l'aviez appelé en utilisant "-performSelector:"
Sophistifunk
14
Je veux juste clarifier la note technique: la plupart du temps, vous aurez besoin de l'indicateur de l'éditeur de liens -ObjC, et non de -all_load. -all_load est recommandé dans l'instance (je suppose rare) où vous avez une bibliothèque sans classes, juste des catégories.
Chris Hill
3
Selon stackoverflow.com/a/2615407/62, cela a été corrigé depuis XCode 4.2, vous n'avez donc plus besoin des indicateurs -all_load ou -force_load. Vous avez toujours besoin de -ObjC.
Liron Yahdav