Ponieważ wszystkie zestawy SDK są dostępne, przydatne jest tworzenie dla wielu zestawów SDK i platform. Jednak przy przeskakiwaniu z wersji 3.2 do 3.0, a nawet czasami od 2.x, często otrzymuję przestarzałe ostrzeżenia dotyczące metod, które zostały zmienione lub zastąpione:
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
Ponieważ nadal chcę zachować zgodność ze starszymi systemami operacyjnymi, a także staram się usunąć „szum” podczas budowania, czy istnieje sposób na wyłączenie lub wyłączenie tych ostrzeżeń?
Odpowiedzi:
Wypróbuj
-Wno-deprecated-declarations
lub odpowiadające mu ustawienie w XcodeGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS
(wskazówka dla profesjonalistów: po prostu wpisz „przestarzałe” w ustawieniach kompilacji, aby znaleźć określone ustawienie dla tego ostrzeżenia).Aktualne wersje Xcode (np. Xcode 9.2):
Starożytne wersje Xcode (np. Xcode 2.x, 3.x):
źródło
Ponieważ nie mogę jeszcze dodać komentarza do posta @samiq, myślę, że go rozbuduję. Wprowadź wspomnianą dyrektywę przed funkcją / metodą, w której używasz przestarzałych rzeczy. Następnie możesz przywrócić poprzednie ustawienie po zdefiniowaniu zakończenia funkcji:
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - (void) methodUsingDeprecatedStuff { //use deprecated stuff } #pragma GCC diagnostic pop
źródło
#pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop
ponieważ ta metoda przeniesie Cię z powrotem do ustawień, które zostały ustawione wcześniej. [ Gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]Clang udostępnia przydatną funkcję, która sprawia, że krok „przywracania” w poście @manicaesar jest niezależny od początkowego stanu ostrzeżenia:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - (void) methodUsingDeprecatedStuff { //use deprecated stuff } #pragma clang diagnostic pop
Cytując instrukcję Clang :
źródło
Ponieważ zwykle potrzebujemy obsługiwać starsze systemy operacyjne, ale zwróć uwagę na nasze ostrzeżenia, chciałem to zrobić w bardziej uporządkowany sposób. Złożyłem to razem, zainspirowany kodem Mozilli:
#define SILENCE_DEPRECATION(expr) \ do { \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ expr; \ _Pragma("clang diagnostic pop") \ } while(0) #define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr) #define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr)
Pozwala to na wykonanie następujących czynności:
SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]);
Działa również z blokami kodu:
SILENCE_IOS7_DEPRECATION( view = [[MKPolylineView alloc] initWithPolyline:self]; view.lineWidth = self.lineWidth; view.strokeColor = self.color; );
Ponadto, jeśli zrezygnujesz z obsługi urządzeń starszych niż iOS 7, możesz łatwo przeszukać kod, aby znaleźć przestarzałe zastosowania do naprawienia.
źródło
do { ... } while(0);
wymagane?do{...}while(0);
jest to szczególnie wymagane? Dlaczego nie po prostu{...}
? Dlaczego nieif(true){...}
? itd.Możesz również pomijać ostrzeżenia na plik, używając
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
co z kolei sprawia, że jest to trochę lepsza praktyka niż zwykłe tłumienie wszystkich ostrzeżeń raz i razem ... w końcu dowiedziałeś się, po co to robisz.
źródło
Jeśli chcesz wyciszyć ostrzeżenie Implementing deprecated method lub Implementing deprecated class , użyj:
źródło
W ustawieniach kompilacji znajdź
Deprecated Functions
.źródło
Jeśli chcesz uzyskać ogólne sprawdzenie pod kątem wszelkiego rodzaju przestarzałych elementów kodu. Proszę używać -Wdeprecated flagę jak poniżej:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated" - (void) methodUsingDeprecatedStuff { //use deprecated stuff } #pragma clang diagnostic pop
źródło
Aby wyłączyć ostrzeżenie z pliku nagłówkowego innej firmy, dodaj następujący wiersz na początku pliku
#pragma clang system_header
źródło