2010-12-14 4 views
7

Chciałbym wiedzieć, jak sprawdzić, czy kod nie wywołuje niedostępne metody, gdy cel wdrożenia jest gorszy od podstawowego SDK?Jak sprawdzić, czy niedostępne metody są używane, jeśli cel wdrożenia <podstawowy sdk?

Możliwe jest uruchomienie aplikacji na urządzeniu z SDK równym docelowej instalacji, ale szukam bardziej "automatycznego". Dowolny pomysł ?

Pozdrawiam, Quentin

+1

Myślę, że chce ostrzeżeń kompilacji dla brakujących metod, gdy na niższym iOS niż podstawowy SDK. XCode da ci tylko ostrzeżenia podczas kompilacji dla zainstalowanego aktualnego sdk, więc nie sądzę, że jest to możliwe. Jeśli musisz przetestować tylko jedno urządzenie, możesz napisać kilka przypadków testowych dla tego urządzenia i je uruchomić. – vakio

+0

Dokładnie! Tak więc nie jest to możliwe :(. – Quentin

+0

Możliwy duplikat [Czy istnieje sposób, aby XCode ostrzegał o nowych wywołaniach API?] (Http://stackoverflow.com/questions/4676000/is-there-a-way-for- xcode-to-warn-about-new-api-calls) – JosephH

Odpowiedz

0
  1. najlepszym sposobem, aby zrobić to, co znalazłem: skompilować kod ze starego SDK :) link which can help

  2. Myślę, że to pytanie jest releated z next

  3. wierzę, że pewnego dnia Jabłko pozwalają skompilować projekt na starym SDK zwykłą definiowania #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0

  4. UPD: Znalazłem rozwiązanie here

4,3 5,0 i 5,1 SDK po prostu nie skompilować po próbując przedefiniować to makro

2

użycie NSClassFromString();

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

jest to czego szukasz?

+0

if ([klasa NSOrderedSet]!= nil) działa lepiej na iOS 4.2+ skompilowanym w/LLVM 1.6+. (patrz http://www.marco.org/2010/11/22/supporting-older-versions-of-ios-while-using-new-apis) –

0

Szukasz czegoś jak - (BOOL) respondsToSelector: (SEL) aSelector

0

Jeśli masz instancji klasy, można użyć następujących czynności, aby sprawdzić, czy rozumie metody chcesz zadzwonić :

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

Tutaj mipmapBrowserView jest instancją IKImageView, który został po raz pierwszy wprowadzony w systemie Mac OS X 10.5. Metoda IKImageView została dodana dopiero w 10.6, więc muszę sprawdzić przed jej wywołaniem. Pozwala mi to na kompilację z pakietem SDK 10.6 i korzystanie z nowych funkcji, ale nadal obsługuje system OS X 10.5. Podczas gdy ten przykład dotyczy systemu OS X, a nie iOS, ta sama metoda (kalambur?) Działa również w systemie iOS.

Zauważ, że rzeczy są nieco inaczej, gdy jesteś instacji klasy, i chcesz wiedzieć czy nadklasą odpowiada pewnej selektora:

„Nie można przetestować, czy obiekt dziedziczy metody z nadklasy wysyłając respondsToSelector: do obiektu za pomocą super słowa kluczowego Metoda ta będzie nadal testowała obiekt jako całość, a nie tylko implementację superklasy, dlatego wysyłanie respondsToSelector: to super jest równoważne wysyłaniu go do siebie. metoda klasy NSObject instancesRespondToSelector: bezpośrednio na superklasie obiektu .... "

3

Najprostszym sposobem, aby to zrobić jest użycie preprocesora __IPHONE_OS_VERSION_MAX_ALLOWED zdefiniowania.

Można to zrobić poprzez dodanie

__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2 

lub coś podobnego swojej opcji „Preprocessor Makra” w ustawieniach kompilacji do docelowego. Możesz przejrzeć wersje dostępne w <Availability.h>.

Niestety, jeśli dodasz ten parametr, spowoduje to niedopasowanie błędów do prekompilowanego nagłówka. Aby naprawić, musisz wyłączyć opcję "Prefiks prefiksu nagłówka" w ustawieniach kompilacji.

Po wykonaniu tej czynności otrzymasz kilka błędów dla klas, które nie istnieją w docelowym pakiecie SDK (na przykład NSOrderedSet nie istnieje w systemie iOS 4.2). Jeśli próbujesz wrócić do pre-iOS 4, prawdopodobnie dostaniesz tak dużo błędów, że kompilator poręczy - nie znam żadnego obejścia tego problemu. W każdym razie zignoruj ​​błędy dotyczące brakujących klas w nagłówkach UIKit i przejdź na dół listy błędów; tam powinieneś znaleźć błąd za każdym razem, gdy używasz metody lub klasy, która nie jest zawarta w zestawie SDK wskazanym przez __IPHONE_OS_VERSION_MAX_ALLOWED. Upewnij się, że każda z tych metod jest dołączona do zestawu i powinieneś być bezpieczny. Należy to zrobić. Klasy, których może brakować, powinny być przetestowane również pod numerem

if ([NSOrderedSet class] != nil) 

Ustawienia te nie są przypadkiem, w którym chcesz zapomnieć o odwróceniu. Aby ustawić tę opcję jako automatyczną, wykonaj następujące czynności:

  1. Utwórz nową konfigurację kompilacji o nazwie "Stare testy SDK".
  2. Definiuj __IPHONE_OS_VERSION_MAX_ALLOWED, a opcję prekompilowanych nagłówków tylko dla tej konfiguracji (naciśnij strzałkę rozwijania obok każdej linii w Ustawieniach kompilacji, aby uzyskać dostęp do poszczególnych ustawień konfiguracji).
  3. Powiel swój obecny Schemat i ustaw jego nazwę na "Stare sprawdzanie SDK".
  4. Skonfiguruj konfigurację elementu Uruchom w tym nowym schemacie do konfiguracji kompilacji utworzonej w kroku 1.
  5. Wybierz nowy schemat i kompilację.

Uwagi:

  • robię żadnej gwarancji, że będzie to złapać dowolny/wszystkich swoich problemów.
  • Wszystko poza UIKit nie zostanie przechwycone przez tę kontrolę.
  • To nie jest substytut testowania kodu w wersjach systemu iOS, który planuje obsłużyć.
Powiązane problemy