2010-12-14 9 views
7

Me gustaría saber cómo comprueba que su código no llame a los métodos no disponibles cuando el destino de despliegue es inferior al SDK base.¿Cómo comprobar si los métodos no disponibles se utilizan si el destino de destino <base sdk?

Es posible ejecutar la aplicación en un dispositivo con el SDK igual al objetivo de despliegue, pero busco de una manera más 'automática'. Alguna idea ?

Saludos, Quentin

+1

Creo que quiere advertencias en tiempo de compilación para los métodos que faltan cuando está en un iOS más bajo que el sdk base. XCode solo te dará advertencias en tiempo de compilación para la base de datos sdk actual instalada, por lo que no creo que sea posible. Si solo necesita probar un dispositivo, puede escribir un montón de casos de prueba para ese dispositivo y ejecutarlos. – vakio

+0

¡Exactamente! Por lo tanto, no es posible :(. – Quentin

+0

Posible duplicado de [¿Hay alguna manera de que XCode advierta sobre nuevas llamadas a la API?] (Http://stackoverflow.com/questions/4676000/is-there-a-way-for- xcode-to-warn-about-new-api-calls) – JosephH

Respuesta

0
  1. mejor manera de hacer lo que he encontrado: compilar el código con el viejo SDK :) link which can help

  2. Creo que esta pregunta se releated con next

  3. Me creer que algún día de Apple permite compilar proyecto para el viejo SDK por simple definición #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0

  4. UPD: he encontrado una solución here

4,3 5,0 y 5,1 SDK simplemente dejar de compilar después de tratar de redefinir esta macro

2

uso NSClassFromString();

Class cls = NSClassFromString(@"YourClass"); 
if (cls == nil) 

es esto que está buscando?

+0

if ([NSOrderedSet class]!= nil) funciona mejor en iOS 4.2+ compilado con LLVM 1.6+. (ver http://www.marco.org/2010/11/22/supporting-older-versions-of-ios-while-using-new-apis) –

0

¿Usted está buscando algo así como - (BOOL) respondsToSelector: (SEL) aSelector

0

Si tiene una instancia de una clase, puede utilizar lo siguiente para ver si entiende el método al que desea llamar :

if ([mipmapBrowserView respondsToSelector:@selector(setBackgroundColor:)]) { 
    // set the background layer since IKImageView supports it 
} 

Aquí, mipmapBrowserView es una instancia de IKImageView, que se introdujo por primera vez en Mac OS X 10.5. Sin embargo, el método setBackgroundColor: de IKImageView solo se agregó en 10.6, por lo que debo verificarlo antes de invocarlo. Esto me permite compilar contra el SDK 10.6, y aprovechar las nuevas características, y aún soportar OS X 10.5 también. Si bien este ejemplo involucra OS X en lugar de iOS, el mismo método (¿juego de palabras intencionado?) También funciona en iOS.

Tenga en cuenta que las cosas son ligeramente diferentes cuando se está de subclases de una clase, y desea saber si la superclase responde a una cierta selector:

"No se puede comprobar si un objeto hereda un método de su superclase enviando respondsToSelector: al objeto usando la palabra clave super.Este método seguirá probando el objeto como un todo, no solo la implementación de la superclase. Por lo tanto, enviar respondsToSelector: a super es equivalente a enviarlo a sí mismo. En su lugar, debe invocar el método de clase NSObject instancesRespondToSelector: directamente en la superclase del objeto .... "

3

La forma más sencilla de hacerlo es utilizar el preprocesador __IPHONE_OS_VERSION_MAX_ALLOWED definir.

Esto se hace mediante la adición de

__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2 

o algo similar a la opción de "preprocesador macros" en la configuración de generación de su objetivo. Puede buscar versiones disponibles en <Availability.h>.

Desafortunadamente, si agrega esta definición, causará errores de discrepancia con su encabezado precompilado. Por lo tanto, para solucionarlo, debe desactivar la opción "Precompilar el encabezado del prefijo" en la configuración de su compilación también.

Una vez hecho esto, obtendrá un montón de errores para las clases que no existen en su SDK específico (por ejemplo, NSOrderedSet no existe en iOS 4.2). Si intenta regresar antes de iOS 4, probablemente obtendrá tantos errores que el compilador se rescatará. No conozco una solución alternativa para esto. En cualquier caso, ignore los errores sobre clases faltantes en los encabezados de UIKit, y vaya al final de la lista de errores; allí debería encontrar un error cada vez que utiliza un método o clase que no está incluido en el SDK al que señala __IPHONE_OS_VERSION_MAX_ALLOWED. Asegúrese de que cada uno de estos métodos esté encerrado en un

if([targetObject respondsToSelector:@selector(thePossiblyMissingSelector:)] 

y debe estar seguro. Las clases que pueden faltar deben ser probados

if ([NSOrderedSet class] != nil) 

Estos ajustes no son algo que se quiere olvidar accidentalmente a voltear hacia atrás sin embargo. Para que esto sea una opción automática para probar, haga lo siguiente:

  1. Cree una nueva configuración de construcción llamada algo así como "Old SDK Testing".
  2. Defina __IPHONE_OS_VERSION_MAX_ALLOWED y la opción de encabezado precompilado solo para esta configuración (presione la flecha de divulgación junto a cada línea en Configuración de compilación para acceder por configuración).
  3. Duplicar su esquema actual y establecer su nombre a algo así como "Old SDK Check".
  4. Establezca la configuración de compilación del elemento Ejecutar en este nuevo esquema a la configuración de compilación que creó en el paso 1.
  5. Seleccione el nuevo Esquema y compilación.

Notas:

  • No hago ninguna garantía de que esto captura de cualquier/todos sus problemas.
  • Cualquier cosa que no pertenezca a UIKit no se verá afectada por este control.
  • Esto no es un sustituto para probar su código en las versiones de iOS que planifican para admitir.
Cuestiones relacionadas