2010-05-25 13 views
116

No puedo encontrar en ningún lado lo que hace el distintivo -all_load al compilar el código Objective-C.¿Qué hace la bandera del enlazador -toda_carga?

Tengo algunos problemas al subir binarios a Apple, dicen que es porque no usé esta bandera, pero mi código se compila incluso sin ella.

¿Puede alguien ayudarme con eso?

Gracias

+2

Normalmente, cualquier error que vea con esto ocurre en el dispositivo cuando se ejecuta la aplicación. ¿Estás diciendo que no probaste tu aplicación en un hardware real antes de que Apple lo revisara? Si es así, esa es una muy, muy mala idea. –

+0

Lo probé, pero mi configuración de "distribución", la que tenía el perfil de aprovisionamiento de la tienda de aplicaciones, no tenía la marca y todas las pruebas se realizaron usando el perfil de desarrollo que tenía la bandera, así 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 como el perfil de distribución no se puede instalar localmente, no pude verificarlo. –

Respuesta

138

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 el iPhone OS, hay un error que impide enlazador -ObjC de la carga estática de los objetos de archivos bibliotecas que contienen solo categorías y sin clases. La solución alternativa es usar los indicadores -all_load o -force_load. -all_load fuerza al enlazador a cargar todos los archivos de objeto de cada archivo que ve, incluso aquellos sin el código Objective-C. -force_load está disponible en Xcode 3.2 y versiones posteriores. Permite un control del grano más fino de la carga del archivo. Cada opción -force_load debe ir seguida de una ruta a un archivo, y cada archivo de objeto en ese archivo se cargará.

+3

Sí, esto entra principalmente en juego con las bibliotecas estáticas para el iPhone. Si se compilan sin este marcador de enlazador, las categorías no se incluyen en el binario construido y cualquier aplicación que use estas bibliotecas estáticas tendrá errores de tiempo de ejecución cuando se ejecute en el hardware de iPhone OS. –

+1

¿no debería haber algunas advertencias o errores del método faltante en tiempo de compilación? –

+18

No, porque 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 envíos de Obj-C, el vinculador no señala 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

Cuestiones relacionadas