¿Qué hace la bandera del enlazador -all_load?

123

No puedo encontrar en ninguna parte lo que hace el indicador -all_load al compilar el código Objective-C.

Tengo algunos problemas para cargar binarios en Apple, dicen que es porque no utilicé este indicador, pero mi código se compila incluso sin él.

¿Puede alguien ayudarme con eso?

Gracias

Guy Ephraim
fuente
2
Por lo general, cualquier error que vea con esto ocurre en el dispositivo cuando ejecuta la aplicación. ¿Está diciendo que no probó su aplicación en el hardware real antes de enviarla para su revisión por parte de Apple? Si es así, es una muy, muy mala idea.
Brad Larson
Lo probé, sin embargo, mi configuración de "distribución", la que tenía el perfil de aprovisionamiento de la tienda de aplicaciones, no tenía el indicador y todas las pruebas se realizaron utilizando el perfil de desarrollo que tenía el indicador, por lo que todo parece estar bien, y cuando Lo compilé para la tienda de aplicaciones con el perfil de distribución, el indicador estaba apagado, y debido a que el perfil de distribución no se puede instalar localmente, no pude verificarlo.
Guy Ephraim

Respuestas:

144

Probablemente esté relacionado con esta nota técnica https://developer.apple.com/library/content/qa/qa1490/_index.html

IMPORTANTE: Para aplicaciones de 64 bits y iPhone OS, hay un error en el enlazador que impide que -ObjC cargue archivos de objetos de bibliotecas estáticas que contienen solo categorías y no clases. La solución alternativa es usar los indicadores -all_load o -force_load. -all_load obliga al vinculador a cargar todos los archivos de objetos de cada archivo que ve, incluso aquellos sin código Objective-C. -force_load está disponible en Xcode 3.2 y versiones posteriores. Permite un control de grano más fino de la carga de archivos. Cada opción -force_load debe ir seguida de una ruta a un archivo, y se cargará cada archivo de objeto en ese archivo.

Sharjeel Aziz
fuente
3
Sí, esto entra principalmente en juego con las bibliotecas estáticas para el iPhone. Si se compilan sin este indicador de vinculador, las categorías no se incluyen en el binario integrado y cualquier aplicación que use estas bibliotecas estáticas tendrá errores de tiempo de ejecución cuando se ejecute en el hardware del iPhone OS.
Brad Larson
1
¿No debería haber algunas advertencias o errores del método faltante en el momento de la compilación?
Guy Ephraim
18
No, debido a que las categorías existen en tiempo de compilación, simplemente no están vinculadas al binario final. Pero debido a la naturaleza dinámica de los despachos de Obj-C, el enlazador no dirige el código de llamada directamente al método de implementación, por lo que nunca se da cuenta de que falta. Luego, en tiempo de ejecución, obtienes el kaboom, lo mismo que si lo hubieras llamado usando "-performSelector:"
Sophistifunk
14
Solo quiero aclarar la nota técnica: la mayoría de las veces querrás el indicador de enlace -ObjC, no -all_load. -all_load se recomienda en la instancia (supongo que es rara) donde tiene una biblioteca sin clases, solo categorías.
Chris Hill
3
Según stackoverflow.com/a/2615407/62, esto se ha solucionado a partir de XCode 4.2, por lo que ya no necesita los indicadores -all_load o -force_load. Aún necesitas -ObjC.
Liron Yahdav