Xcode 5 e iOS 7: architecture y architectures válidas

Estoy comenzando un nuevo proyecto en Xcode 5. Deseo desarrollar una aplicación usando iOS SDK 7 pero con un destino de implementación iOS 5.0 . Tan pronto como creo un nuevo proyecto en Xcode y trato de cambiar el destino de implementación a 5.0, recibo este mensaje:

 Applications including an arm64 slice are not compatible with versions of iOS prior to 6.0 Adjust your Architectures build setting to not include arm64 in order to deploy to releases prior to iOS 6.0. 

Así que cambió las architectures a Standard (sin 64 bits). Compilo, corro pero realmente no entiendo lo que sucedió.

¿Cuál es la diferencia entre las configuraciones de Valid architectures y Valid architectures en la configuración de comstackción del proyecto Xcode?
Si configuro Architectures para excluir 64 bits, ¿qué sucede cuando ejecuto mi aplicación en el iPhone de 64 bits o en el Simulador de iOS (sé que funciona, solo tengo curiosidad por saber qué sucede debajo)?
¿Puedes explicar el gran desorden con la nueva architecture de 64 bits?

enter image description here

Establezca la architecture en la configuración de construcción en Arquitecturas estándar (armv7, armv7s)

enter image description here

El iPhone 5S funciona con un procesador A7 de 64 bits. De Apple Docs

Xcode puede construir su aplicación con ambos binarios de 32 bits y 64 bits incluidos. Este binario combinado requiere un objective de implementación mínimo de iOS 7 o posterior.

Nota: Una versión futura de Xcode le permitirá crear una única aplicación que sea compatible con el tiempo de ejecución de 32 bits en iOS 6 y posterior, y que sea compatible con el tiempo de ejecución de 64 bits en iOS 7.

De la documentación lo que entendí es

  • Xcode puede crear binarios de 64 bits de 32 bits para una sola aplicación, pero el objective de despliegue debería ser iOS7. Dicen que en el futuro será iOS 6.0
  • El binario de 32 bits funcionará bien en el iPhone 5S (procesador de 64 bits).

Actualización (Xcode 5.0.1)
En Xcode 5.0.1, agregaron el soporte para crear un binario de 64 bits para iOS 5.1.1 en adelante.

Xcode 5.0.1 puede construir su aplicación con ambos binarios de 32 bits y 64 bits incluidos. Este binario combinado requiere un objective de implementación mínimo de iOS 5.1.1 o posterior. El binario de 64 bits solo se ejecuta en dispositivos de 64 bits con iOS 7.0.3 y versiones posteriores.

Actualización (Xcode 5.1)
Xcode 5.1 realizó cambios significativos en la sección de architecture. Esta respuesta será un seguimiento para usted. Mira esto

Cuando configura 64 bits, el binario resultante es un binario “gordo”, que contiene las tres imágenes de Mach-O incluidas con un encabezado delgado. Puedes ver eso usando otool o jtool. Puede ver algunos binarios binarios incluidos como parte del iOS SDK SDK, por ejemplo AVFoundation Framework, de la siguiente manera:

 % cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/ %otool -V -f AVFoundation 9:36 Fat headers fat_magic FAT_MAGIC nfat_arch 3 architecture arm64 # The 64-bit version (A7) cputype CPU_TYPE_ARM64 cpusubtype CPU_SUBTYPE_ARM64_ALL capabilities 0x0 offset 16384 size 2329888 align 2^14 (16384) architecture armv7 # A5X - packaged after the arm64version cputype CPU_TYPE_ARM cpusubtype CPU_SUBTYPE_ARM_V7 capabilities 0x0 offset 2359296 size 2046336 align 2^14 (16384) architecture armv7s # A6 - packaged after the armv7 version cputype CPU_TYPE_ARM cpusubtype CPU_SUBTYPE_ARM_V7S capabilities 0x0 offset 4407296 size 2046176 align 2^14 (16384) 

En cuanto al binario en sí, usa el conjunto de instrucciones de bit ARM64, que es (en su mayoría compatible con 32 bits, pero) un conjunto de instrucciones totalmente diferente. Esto es especialmente importante para el progtwig de gráficos (usando instrucciones y registros NEON). Del mismo modo, la CPU tiene más registros, lo que tiene un gran impacto en la velocidad del progtwig. Hay una discusión interesante en http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons sobre si esto hace una diferencia o no; las pruebas de evaluación comparativa hasta ahora han indicado claramente que sí lo hace.

Al usar otool -tV se volcará el ensamblaje (si tiene XCode 5 y posterior), y luego podrá ver las diferencias de configuración de instrucciones para usted. La mayoría de los desarrolladores (aunque no todos) seguirán siendo agnósticos a los cambios, ya que en su mayoría no afectan directamente a Obj-C (sin perjuicio de las API CG *), y tienen que hacer más con el manejo de punteros de bajo nivel. El comstackdor trabajará su magia y optimizaciones.

Mi comprensión de Apple Docs.

  • ¿Qué es Arquitecturas (ARCHS) en las configuraciones de construcción de Xcode?
    • Especifica la / s architecture / s a ​​las que se dirige el binario. Cuando se especifica más de una architecture, el binario generado puede contener código objeto para cada una de las architectures especificadas.
  • ¿Qué son las architectures válidas (VALID_ARCHS) en las configuraciones de construcción de Xcode?

    • Especifica la architecture / s para las cuales el binario puede ser CONSTRUIDO .
    • Durante el proceso de comstackción, esta lista se cruza con ARCHS y la lista resultante especifica las architectures en las que se puede ejecutar el binario.
  • Ejemplo: – Un proyecto de iOS tiene las siguientes configuraciones de construcción en Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • En este caso, se creará binario para las architectures armv7 armv7s arm64. Pero el mismo binario se ejecutará en ONLY ARCHS = armv7 armv7s.

No necesita limitar su comstackdor solo a armv7 y armv7s eliminando la configuración de arm64 de las architectures compatibles. Solo necesita establecer la configuración de destino de Implementación en 5.1.1

Nota importante: no puede establecer el objective de implementación en 5.1.1 en la sección Configuraciones de comstackción porque es desplegable solo con valores fijos. Pero puede configurarlo fácilmente en 5.1.1 en la sección General de la configuración de la aplicación simplemente escribiendo el valor en el campo de texto.

Solución simple:

Objetivos -> Configuraciones de comstackción -> Opciones de comstackción -> Activar código de bits -> No

Funciona en el dispositivo con iOS 9.3.3

Ninguna de las respuestas funcionó y luego me olvidé de establecer un objective de implementación mínimo que se puede encontrar en Proyecto -> General -> Información de implementación -> Destino de despliegue -> 8.0

Ejemplo