2011-02-07 10 views
70

Mamy naszą bibliotekę, którą wysyłamy do naszych klientów i chciałbym zaznaczyć niektóre metody jako "przestarzałe", ponieważ zmieniliśmy je (tak jak Apple w iPhone SDK).Jak odrzucić metodę w Xcode

Widziałem makro __OSX_AVAILABLE_BUT_DEPRECATED pre-procesor, który jest mapowany do __AVAILABILITY_INTERNAL, który jest mapowany do __attribute__((deprecated)) ...

Cóż, jestem nieco mylić z tych rzeczy!

Ktoś wie coś na ten temat?

Odpowiedz

141

__attribute__((deprecated)) to gcc way (również supported in clang) oznaczania funkcji/metody jako wycofanej. Kiedy ktoś zostanie oznaczony jako "przestarzały", ostrzeżenie zostanie wygenerowane za każdym razem, gdy ktoś go wywoła.

Składnia normalnych funkcji byłoby

__attribute__((deprecated)) 
void f(...) { 
    ... 
} 

// gcc 4.5+/clang 
__attribute__((deprecated("g has been deprecated please use g2 instead"))) 
void g(...) { 
    ... 
} 

i metod Objective-C będzie

@interface MyClass : NSObject { ... } 
-(void)f:(id)x __attribute__((deprecated)); 
... 
@end 

Można również zaznaczyć całą klasę jako przestarzałe z

__attribute__((deprecated)) 
@interface DeprecatedClass : NSObject { ... } 
... 
@end 

Apple również dostarcza nagłówek <AvailabilityMacros.h>, który udostępnia makra DEPRECATED_ATTRIBUTE i DEPRECATED_MSG_ATTRIBUTE (msg), które rozszerzają się do powyższych atrybutów lub nic, jeśli kompilator nie obsługuje atrybutów. Zauważ, że ten nagłówek nie istnieje poza OS X/iOS.


marginesie, jeśli używasz Swift użyć @available attribute aby potępiać element, na przykład

@available(*, deprecated=2.0, message="no longer needed") 
func f() { 
    ... 
} 
+0

Dziękuję za szybką odpowiedź, jestem prawie pewien, że to pomoże, szukałem na chwilę przed pytaniem :) – Julien

+1

Mam tylko jedno pytanie: czy jest możliwe, aby dodać wiadomość jak "Użyj metody XXX zamiast"? – Julien

+21

@Julien: Tak: '__attribute ((przestarzałe (użyj zamiast tego metody XXX)))'. Ale ta składnia jest dostępna tylko począwszy od gcc 4.5, a wersja dostarczana z Xcode to 4.2 ... – kennytm

64

Można również użyć bardziej czytelny określićDEPRECATED_ATTRIBUTE

ona definiowana w usr/include/AvailabilityMacros.h:

#define DEPRECATED_ATTRIBUTE  __attribute__((deprecated)) 
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg)))) 

Objective-C przykładem metody:

@interface MyClass : NSObject { ... } 
-(void)foo:(id)x DEPRECATED_ATTRIBUTE; 

// If you want to specify deprecated message: 
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead."); 
... 
@end 

Można również zaznaczyć całą klasę jako przestarzałe:

DEPRECATED_ATTRIBUTE 
@interface DeprecatedClass : NSObject { ... } 
... 
@end 
+2

W ten sposób Apple robi to również w klasach iOS. Prawdopodobnie lepsza metoda. – LunaCodeGirl

+2

To zdecydowanie lepsza metoda. Szkoda, że ​​to nie jest wybrana odpowiedź ani wyższa głosowana odpowiedź. – Benjohn

+0

jak mogę użyć 'DEPRECATED_MSG_ATTRIBUTE' do oznaczenia klasy jako przestarzałej z wiadomością (np. UIAlertView) – Multinerd

Powiązane problemy