2010-12-14 7 views
7

Ich würde gerne wissen, wie Sie überprüfen, dass Ihr Code nicht verfügbaren Methoden nicht aufrufen, wenn das Deployment-Ziel schlechter als Base-SDK ist?Wie überprüft man, ob nicht verfügbare Methoden verwendet werden, wenn das Implementierungsziel <base sdk?

Es ist möglich, die Anwendung auf einem Gerät mit dem SDK gleich Bereitstellung Ziel ausführen, aber ich suche einen Weg mehr "automatisch". Irgendeine Idee ?

Grüße, Quentin

+1

Ich denke, er will Kompilierung Warnungen für fehlende Methoden, wenn auf einem niedrigeren iOS als die Basis-SDK. XCode gibt Ihnen nur Warnungen zur Kompilierzeit für die aktuelle Basis-SDK installiert, so glaube ich nicht, dass es möglich ist. Wenn nur ein Gerät getestet werden muss, können Sie mehrere Testfälle für dieses Gerät schreiben und diese ausführen. – vakio

+0

Genau! Also ist es nicht möglich :(. – Quentin

+0

Mögliches Duplikat von [Gibt es eine Möglichkeit für XCode, vor neuen API-Aufrufen zu warnen?] (Http://stackoverflow.com/questions/4676000/is-there-a-way-for- xcode-to-warn-about-new-api-Aufrufe) – JosephH

Antwort

0
  1. bester Weg, das zu tun, die ich gefunden: kompilieren Code mit alten SDK :) link which can help

  2. Ich denke, diese Frage mit releated ist next

  3. ich, dass ein Tag belive von Apple erlaubt Projekt zu kompilieren für alte SDK durch einfaches definieren #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0

  4. upd: ich fand Lösung here

4,3 5,0 und 5,1 SDK einfach nicht zu kompilieren, nachdem er versucht dieses Makro

2

Verwendung NSClassFromString();

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

ist dies die Sie suchen?

+0

if ([NSOrderedSet class]!= nil) funktioniert besser auf iOS 4.2 + kompiliert mit LLVM 1.6+. (siehe http://www.marco.org/2010/11/22/support-older-versions-of-ios-while-using-new-apis) –

0

Suchen Sie nach so etwas wie - (BOOL) respondsToSelector: (SEL) aSelector

0

Wenn Sie eine Instanz einer Klasse haben, können Sie folgendes sehen verwenden, wenn es die Methode versteht Sie anrufen möchten :

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

Hier mipmapBrowserView ist eine Instanz IKImageView, die zuerst in Mac OS X 10.5 eingeführt wurde. Die setBackgroundColor: Methode von IKImageView wurde jedoch nur in 10.6 hinzugefügt, also muss ich überprüfen, bevor ich sie anrufe. Dies ermöglicht es mir, gegen das 10.6 SDK zu bauen und die Vorteile der neuen Funktionen zu nutzen und dennoch OS X 10.5 zu unterstützen. Während dieses Beispiel OS X und nicht iOS betrifft, funktioniert die gleiche Methode (Wortspiel?) Auch in iOS.

Beachten Sie, dass die Dinge etwas anders, wenn Sie eine Klasse Subklassen, und Sie wollen wissen, ob die übergeordnete Klasse zu einem bestimmten Selektor antwortet:

„Sie können nicht testen, ob ein Objekt eine Methode aus seiner übergeordneten Klasse erbt Durch das Senden von answersToSelector: an das Objekt mit dem Schlüsselwort super. Diese Methode wird immer noch das Objekt als Ganzes testen, nicht nur die Implementierung der Superklasse.Das Senden von answersToSelector: an super entspricht also dem Senden an sich selbst. Stattdessen müssen Sie aufrufen die NSObject-Klassenmethode instancesRespondToSelector: direkt in der Oberklasse des Objekts .... "

3

Der einfachste Weg, neu zu definieren, dies zu tun ist die __IPHONE_OS_VERSION_MAX_ALLOWED Präprozessor definieren zu verwenden.

Sie tun dies, indem

Zugabe
__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2 

oder etwas ähnliches zu Ihrer „Präprozessormakros“ Option in Build-Einstellungen Ihres Ziels. Sie können die verfügbaren Versionen in <Availability.h> nachschlagen.

Leider, wenn Sie diese Definition hinzufügen, verursacht es Mismatch-Fehler mit Ihrem vorkompilierten Header. Um das zu beheben, müssen Sie die Option "Precompile Prefix Header" auch in Ihren Build-Einstellungen deaktivieren.

Sobald Sie dies tun, erhalten Sie eine Reihe von Fehlern für Klassen, die nicht in Ihrem SDK vorhanden sind (zum Beispiel NSOrderedSet existiert nicht in iOS 4.2). Wenn Sie versuchen, vor iOS 4 zurückzugehen, werden Sie wahrscheinlich so viele Fehler bekommen, dass der Compiler bailt - ich kenne keine Problemumgehung dafür. Ignorieren Sie in jedem Fall die Fehler bezüglich fehlender Klassen in den UIKit-Headern und gehen Sie zum Ende der Fehlerliste. Dort sollten Sie jedes Mal einen Fehler finden, wenn Sie eine Methode oder Klasse verwenden, die nicht im SDK enthalten ist, auf das mit __IPHONE_OS_VERSION_MAX_ALLOWED verwiesen wird. Stellen Sie sicher, dass jede dieser Methoden in einem

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

enthalten ist, und Sie sollten sicher sein. Klassen, die auch sein kann fehlen sollte

getestet
if ([NSOrderedSet class] != nil) 

Diese Einstellungen sind nicht etwas, was Sie versehentlich vergessen wollen jedoch kippen zurück. Gehen Sie folgendermaßen vor, um das zu einer automatischen Option für das Testen zu machen:

  1. Erstellen Sie eine neue Buildkonfiguration, die wie "Old SDK Testing" bezeichnet wird.
  2. Definieren Sie die Option __IPHONE_OS_VERSION_MAX_ALLOWED und die Option für den vorkompilierten Kopf nur für diese Konfiguration (klicken Sie auf den Pfeil neben den einzelnen Zeilen in den Buildeinstellungen, um auf die einzelnen Konfigurationseinstellungen zuzugreifen).
  3. Duplizieren Sie Ihr aktuelles Scheme und setzen Sie seinen Namen auf "Old SDK Check".
  4. Legen Sie in diesem neuen Schema den Build Configuration des Run-Elements auf die in Schritt 1 erstellte Buildkonfiguration fest.
  5. Wählen Sie das neue Schema aus, und erstellen Sie.

Hinweise:

  • Ich mache keine Garantie, dass dies jede/alle Ihre Fragen zu fangen.
  • Alles außerhalb von UIKit wird von diesem Test nicht erfasst.
  • Dies ist kein Ersatz für das Testen Ihres Codes auf den Versionen von iOS Sie planen, zu unterstützen.