¿Por qué la versión del sistema operativo iOS SDK y iOS se afectan entre sí? O bien: ¿Qué es un SDK para iOS?

EDITAR:

La respuesta a continuación de H2CO3 me hace casi feliz. Pero no explica una cosa: ¿por qué obtengo una exception de time de ejecución al build la aplicación contra SDK6 (UIPageViewController requiere un controller secundario antes de agregarlo a un controller primario) pero no cuando se crea contra SDK5? La respuesta de Rolf explica lo que está sucediendo: el dispositivo conoce el SDK con el que se creó una aplicación y se comporta de manera diferente para garantizar la máxima compatibilidad.

Mientras luchaba con versiones de iOS SDK, versiones de MonoTouch y versiones de iOS diferentes, comencé a preguntarme: ¿Qué es un SDK de iOS después de todo ?

Quiero decir, instalo Xcode 4.4 y obtengo iOS SDK 5. Si instalo Xcode 4.5, obtengo iOS SDK 6. Hasta ahora, no hay problema.

  • Ahora supongo que comstackré una aplicación que se targets iOS 5 y que not use any iOS 6 specific cosa not use any iOS 6 specific . Yo, pero creo esta aplicación using iOS SDK 6 .
  • Luego compilo la same app pero uso iOS SDK 5 .

Luego ejecuto ambas versiones de la aplicación en un dispositivo iOS 6.

¿Por qué se comportan de manera diferente? Hay pequeñas diferencias, por ejemplo, UIPageViewController lanza una exception si no se establece ningún controller secundario antes de agregar el controller de vista de página como un elemento secundario a un controller principal.

A mi entender, las devoluciones de llamada, las funciones y todo viene del sistema operativo iOS y no del SDK. Pero el sistema operativo es el mismo en ambos casos.

Comprendo totalmente que si quiero utilizar una característica específica de iOS 6, necesito usar iOS SDK 6 porque una UICollectionView simplemente no existe en SDK 5. Pero el código de la interfaz de usuario de esta vista, obviamente, no se incluye en mi aplicación, de lo contrario, funcionaría en iOS5 también. Entonces, la vista de colección proviene de una biblioteca compartida proporcionada por el sistema operativo.

Además de eso, hay MonoTouch. Si asumimos que cada versión de MonoTouch no es más que una extensión de los enlaces sin corregir ningún error, no debería importar qué versión de MT uso.

Un breve recuento de mi pregunta sería: ¿cómo juegan juntos la versión de iOS, la versión de SDK de iOS, la versión de MonoTouch y la versión de destino de la aplicación?

En teoría, debería poder cambiar del iOS 5 a iOS 6 SDK y no ver ninguna diferencia. En la práctica, es un poco diferente.

  1. El dispositivo conoce el SDK que usó. Esto significa que el dispositivo en sí mismo puede decidir comportarse de manera diferente (por cualquier razón que Apple determine que es una buena idea).
  2. Está utilizando una cadena de herramientas diferente (gcc y binarys relacionados), y pueden comstackr las cosas de manera diferente (esto es raro y no lo he visto suceder).
  3. MonoTouch en sí puede comportarse de manera diferente (no se nos ocurre nada en este momento, pero, por ejemplo, podemos usar diferentes valores pnetworkingeterminados para cosas como el Objetivo de implementación (si no lo has configurado por supuesto)).

Creo que te estás topando con el primer caso: Apple ha añadido algunas restricciones a su jerarquía de UI en iOS6, que solo se aplican si se desarrolló contra el SDK de iOS 6 (para no romper las aplicaciones existentes, supongo).

El SDK de iOS consta de dos componentes: la cadena de herramientas (Clang y / o GCC como comstackdor, ld (64) como linker y otras partes del package cctools (personas de GNU lo llaman binutils ) y las bibliotecas y files de encabezado.

La versión de la cadena de herramientas (comstackdor) no está estrictamente relacionada con el número de versión de iOS. En teoría, cualquier comstackdor cruzado suficiente puede build código para cualquier iOS (aunque en la práctica, hay excepciones y restricciones, que surgen de los errores que Apple cometió al diseñar su comstackdor, incluidos los nombres de las funciones de la biblioteca, las classs y los selectores de methods, etc. .)

Los files y las bibliotecas de encabezado (incluidos los types de bibliotecas "marco" específicos de Apple) son esencialmente una copy de los directorys /usr/include , /usr/lib y /System/Library/Frameworks en iOS. (Incluso esto no es del todo cierto: en iOS, los files de cabecera no están presentes en iOS 3 y en las bibliotecas de iOS 3.1, porque se introdujo el caching compartido de dyld ). Básicamente le dicen al comstackdor y al linker qué funciones, classs y methods están disponibles para una versión específica de iOS. Los files de encabezado son para verificación de time de compilation y las bibliotecas son para verificación de time de vinculación. Básicamente, en un sistema normal no incorporado (es decir, en el escritorio), donde uno no tiene que comstackr un código cruzado, el "SDK" básicamente significaría los mismos files en el sistema operativo en sí , y no lo haría ser llamado un "SDK"; Preferiría ser referido como "el sysroot".