Come contrassegnare un metodo come deprecato in Objective-C 2.0?


141

Faccio parte di un team che sviluppa un'app per iPad abbastanza grande e di conseguenza abbiamo creato molte classi diverse. Il problema è che alcuni dei metodi ora sono praticamente obsoleti e non voglio semplicemente rimuoverli perché so che alcune parti dell'intero sistema usano i metodi ... ma ci sono varianti migliori (più recenti) che dovrebbero essere usate invece (alcuni dei vecchi in realtà chiamano quelli nuovi, ma l'interfaccia generale della classe sta diventando confusa).

Esiste un modo in cui posso contrassegnare alcuni metodi come deprecati (come @deprecatedin Java e [Obsolete]in .NET).

Vedo che Apple usa Availability.h e ha tag come

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... è l'unico modo per farlo (+ è sicuro che l'App Store lo faccia?) o ci sono alternative che segnaleranno un avviso in Xcode?

Risposte:


163

Sintassi di deprecazione

La sintassi viene fornita per contrassegnare i metodi come obsoleti:

@interface SomeClass
-method __attribute__((deprecated));
@end

o:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end

7
Questa macro ha senso per me, in qualche modo mantiene la sensazione della __attribute__sintassi. #define __deprecated__ __attribute__((deprecated))
zekel,

È interessante notare che Xcode non mi dà alcun avvertimento per l'utilizzo di un metodo contrassegnato come ammortizzato. C'è un flag del compilatore che deve essere impostato?
Memmons,

Nel menu a discesa relativo al completamento del codice di Xcode, vedo che il metodo è contrassegnato come deprezzato, ma il suo utilizzo non fornisce un avviso del compilatore.
Memmons,

1
@Answerbot Crea impostazioni> avvisa delle funzioni obsolete ... imposta SÌ
bandejapaisa,

come aggiungere il metodo alternativo che dovrebbe essere usato?
OXXY,

135

IMHO, è più facile scrivere __deprecated:

- (void)myDeprecatedMethod __deprecated;
- (int)methodNameDeprecated:(int)param __deprecated;

Funziona anche con le lezioni

__deprecated
@interface MyDeprecatedClass

  // ... some properties and methods ...

@end

2
Modo molto migliore per farlo.
SG1

1
Nessuna descrizione fornita, quindi non saprai se dovresti usare un metodo diverso o cosa ...
raistlin

1
#define __deprecated __attribute __ ((deprecato))
Parag Bafna

Perché è meglio di DEPRECATED_ATTRIBUTE? Solo perché è più breve o c'è qualche differenza reale?
Kelin

88

Se si desidera fornire un messaggio aggiuntivo con il flag di deprecazione, è possibile utilizzare i flag seguenti.

@property (strong, nonatomic) NSString *catName
                    __deprecated_msg("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    DEPRECATED_MSG_ATTRIBUTE("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    __attribute__((deprecated("use name instead.")));

Usando i flag sopra menzionati, puoi capire perché stai deprecando o qual è il metodo che lo sviluppatore dovrebbe usare in futuro.


2
Preferisco avere un messaggio con un avviso di deprecazione. È molto più utile per i nuovi utenti di un'API. Quindi, penso che questa sia la risposta migliore.
johnnieb,

Mi piace al meglio questa risposta, essendo la più chiara e facile da usare con il copia-incolla di ciò di cui ho bisogno. Potresti anche migliorarlo con un esempio di deprecare un metodo? un'intera classe? È fatto esattamente allo stesso modo?
Motti Shneor,

15

Per contrassegnare un metodo come obsoleto, utilizzare __attribute __ ((deprecato ("Il tuo messaggio va qui")))

Un esempio pratico, da Mantle

@interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions)

+ (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:")));
+ (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:")));

@end

14

Usa l' deprecatedattributo:

- (int)bar: (int)x __attribute__((deprecated));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.