Estoy comenzando un nuevo proyecto en Xcode 5. Quiero desarrollar aplicaciones usando iOS SDK 7
pero con destino de implementación iOS 5.0
. Tan pronto como creo un nuevo proyecto en Xcode e intento cambiar el objetivo 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 arquitecturas a Standard
(sin 64 bits). Yo compilo, se ejecuta pero realmente no entiendo lo que acaba de pasar.
¿Cuál es la diferencia entre la configuración Architectures
y Valid architectures
en la configuración de compilación del proyecto Xcode?
Si configuro Architectures
para excluir 64 bits, ¿qué sucede cuando ejecuto mi aplicación en un iPhone de 64 bits o un simulador de iOS (sé que funciona, solo tengo curiosidad por saber qué sucede debajo)?
¿Puede explicar el gran lío con la nueva arquitectura de 64 bits?
Respuestas:
Establecer la arquitectura en la configuración de compilación en arquitecturas estándar (armv7, armv7s)
El iPhone 5S funciona con un procesador A7 de 64 bits. De los documentos de Apple
De la documentación lo que entendí es
Actualización (Xcode 5.0.1)
En Xcode 5.0.1 agregaron el soporte para crear binarios de 64 bits para iOS 5.1.1 en adelante.
Actualización (Xcode 5.1)
Xcode 5.1 realizó un cambio significativo en la sección de arquitectura. Esta respuesta será un seguimiento para ti. Mira esto
fuente
arm64
.Mi comprensión de Apple Docs.
¿Qué son las arquitecturas válidas (VALID_ARCHS) en la configuración de compilación de Xcode?
Ejemplo: - Un proyecto de iOS tiene las siguientes configuraciones de compilación en Xcode.
fuente
Cuando establece 64 bits, el binario resultante es un binario "Fat", que contiene las tres imágenes Mach-O empaquetadas con un encabezado delgado y delgado. Puedes ver eso usando otool o jtool. Puede consultar algunos binarios gordos incluidos como parte del SDK de iOS 7.0, por ejemplo, AVFoundation Framework, así:
% 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í, utiliza el conjunto de instrucciones ARM de 64 bits, que es (en su mayoría compatible con 32 bits, pero) un conjunto de instrucciones totalmente diferente. Esto es especialmente importante para el programa de gráficos (usando instrucciones y registros NEON). Asimismo, la CPU tiene más registros, lo que tiene un gran impacto en la velocidad del programa. 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; Hasta ahora, las pruebas comparativas han indicado claramente que sí.
El uso de otool -tV volcará el ensamblaje (si tiene XCode 5 y posterior), y luego podrá ver las diferencias del conjunto de instrucciones por sí mismo. La mayoría (pero no todos) los desarrolladores permanecerán ajenos a los cambios, ya que en su mayor parte no afectan directamente a Obj-C (a pesar de las API CG *), y tienen que hacer más con el manejo de punteros de bajo nivel. El compilador hará su magia y optimizaciones.
fuente
No es necesario que limite su compilador solo a armv7 y armv7s eliminando la configuración de arm64 de las arquitecturas compatibles. Solo necesita establecer la configuración del objetivo de implementación en 5.1.1
Nota importante: no puede establecer el objetivo de implementación en 5.1.1 en la sección Configuración de compilación porque es un menú desplegable 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.
fuente
Arreglo simple:
Objetivos -> Configuración de compilación -> Opciones de compilación -> Habilitar código de bits -> No
Funciona en dispositivos con iOS 9.3.3
fuente
Ninguna de las respuestas funcionó y luego me olvidé de establecer el objetivo de implementación mínimo que se puede encontrar en Proyecto -> General -> Información de implementación -> Objetivo de implementación -> 8.0
fuente