2010-12-14 9 views
7

Mi piacerebbe sapere come si controlla che il proprio codice non chiami metodi non disponibili quando la destinazione di distribuzione è inferiore all'SDK di base?Come verificare se vengono utilizzati metodi non disponibili se l'obiettivo di distribuzione <sdk di base?

È possibile eseguire l'applicazione su un dispositivo con SDK uguale a destinazione di distribuzione, ma cerco un modo più "automatico". Qualche idea ?

saluti, Quentin

+1

Penso che desideri avvisi in fase di compilazione per i metodi mancanti quando su un iOS inferiore rispetto al sdk di base. XCode fornirà solo avvisi in fase di compilazione per l'attuale base sdk installato, quindi non penso sia possibile. Se è solo un dispositivo che devi testare, puoi scrivere un sacco di casi di test per quel dispositivo ed eseguirli. – vakio

+0

Esattamente! Quindi non è possibile :(. – Quentin

+0

Possibile duplicato di [C'è un modo per XCode di avvisare sulle nuove chiamate API?] (Http://stackoverflow.com/questions/4676000/is-there-a-way-for- xcode-to-warn-about-new-api-calls) – JosephH

risposta

0
  1. modo migliore per fare ciò che ho trovato: compilare il codice con il vecchio SDK :) link which can help

  2. Credo che questa questione è releated con next

  3. I belive che un giorno di Apple permette di compilare progetto per i vecchi SDK per semplice definizione #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0

  4. UPD: ho trovato la soluzione here

4,3 5,0 e 5,1 SDK solo riuscire a compilare dopo aver tentato di ridefinire questa macro

2

uso NSClassFromString();

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

è questo che stai cercando?

+0

if ([NSOrderedSet class]!= nil) funziona meglio su iOS 4.2+ compilato con LLVM 1.6+. (vedi http://www.marco.org/2010/11/22/supporting-older-versions-of-ios-while-using-new-apis) –

0

Siete alla ricerca di qualcosa di simile - (BOOL) respondsToSelector: (SEL) aSelector

0

Se si dispone di un'istanza di una classe, è possibile utilizzare il seguente per vedere se si capisce il metodo che si desidera chiamare :

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

Qui, mipmapBrowserView è un'istanza di IKImageView, che è stato introdotto in Mac OS X 10.5. Il metodo setBackgroundColor: di IKImageView è stato aggiunto solo in 10.6, tuttavia, quindi ho bisogno di controllare prima di chiamarlo. Ciò mi consente di costruire contro l'SDK 10.6 e di sfruttare le nuove funzionalità, pur continuando a supportare anche OS X 10.5. Mentre questo esempio coinvolge OS X piuttosto che iOS, lo stesso metodo (gioco di parole?) Funziona anche in iOS.

Nota che le cose sono leggermente diverse quando si sottoclasse una classe, e si desidera sapere se la superclasse risponde ad un certo selettore:

"Non si può verificare se un oggetto eredita un metodo dalla propria superclasse inviando respondsToSelector: all'oggetto usando la parola chiave super.Questo metodo continuerà a testare l'oggetto nel suo complesso, non solo l'implementazione della superclasse, quindi l'invio di respondsToSelector: a super equivale a inviarlo a se stesso. istanze del metodo di classe NSObjectRespondToSelector: direttamente sulla superclasse dell'oggetto ... "

3

Il modo più semplice per farlo è quello di utilizzare il preprocessore __IPHONE_OS_VERSION_MAX_ALLOWED definire.

A tale scopo, con l'aggiunta di

__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2 

o qualcosa di simile per l'opzione "preprocessore macro" in Impostazioni build del vostro target. È possibile cercare versioni disponibili in <Availability.h>.

Sfortunatamente se si aggiunge questa definizione causerà errori di disallineamento con l'intestazione precompilata. Quindi, per risolvere il problema è necessario disattivare l'opzione "Precompile Prefix Header" anche nelle impostazioni di compilazione.

Una volta eseguita questa operazione, si avranno un sacco di errori per le classi che non esistono nell'SDK di destinazione (ad esempio NSOrderedSet non esiste in iOS 4.2). Se stai provando a tornare indietro prima di iOS 4, probabilmente riceverai così tanti errori che il compilatore bota: non sono a conoscenza di una soluzione alternativa per questo. In ogni caso, ignorare gli errori relativi alle classi mancanti nelle intestazioni UIKit e andare in fondo all'elenco degli errori; lì dovresti trovare un errore per ogni volta che usi un metodo o una classe che non è inclusa nell'SDK a cui si riferisce __IPHONE_OS_VERSION_MAX_ALLOWED. Assicurarsi che ciascuno di questi metodi è racchiuso in un

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

e si dovrebbe essere al sicuro. Le classi che potrebbero mancare dovrebbero essere testate anche

if ([NSOrderedSet class] != nil) 

Queste impostazioni non sono qualcosa che si desidera dimenticare per errore di rovesciare accidentalmente. Per rendere questa opzione automatica per il test, effettuare quanto segue:

  1. Creare una nuova configurazione di build chiamata qualcosa come "Vecchio test SDK".
  2. Definisci __IPHONE_OS_VERSION_MAX_ALLOWED e l'opzione testa precompilata solo per questa configurazione (fai clic sulla freccia di apertura accanto a ciascuna riga in Impostazioni di creazione per accedere alle impostazioni di configurazione).
  3. Duplica il tuo schema attuale e imposta il suo nome su qualcosa come "Old SDK Check".
  4. Impostare la configurazione di generazione dell'elemento Esegui in questo nuovo schema per la configurazione di generazione creata nel passaggio 1.
  5. Selezionare il nuovo schema e creare.

Note:

  • Faccio alcuna garanzia che questo si cattura qualsiasi/tutti i vostri problemi.
  • Qualsiasi cosa al di fuori di UIKit non verrà catturata da questo controllo.
  • Questo non è un sostituto per testare il codice sulle versioni di iOS è piano per supportare.
Problemi correlati