Como sinalizo um método como obsoleto no Objective-C 2.0?

141

Faço parte de uma equipe que desenvolve um aplicativo para iPad bastante grande e, como resultado, criamos muitas classes diferentes. O problema é que alguns dos métodos agora estão praticamente obsoletos e eu não quero removê-los ainda, pois sei que algumas partes do sistema geral usam os métodos ... mas existem variantes melhores (mais recentes) disponíveis que devem ser usadas em vez disso (alguns dos antigos chamam de novos, mas a interface geral da classe está ficando bagunçada).

Existe uma maneira em que eu possa marcar certos métodos como depreciados (como @deprecatedem Java e [Obsolete].NET).

Vejo que a Apple usa o Availability.he possui tags como

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... é a única maneira de fazê-lo (+ a App Store é segura para fazer isso?) ou existem alternativas que sinalizem um aviso no Xcode?

Jamie Chapman
fonte

Respostas:

163

Sintaxe de reprovação

A sintaxe é fornecida para marcar métodos como obsoletos:

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

ou:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end
Shay Erlichmen
fonte
7
Essa macro faz sentido para mim, mas mantém a sensação da __attribute__sintaxe. #define __deprecated__ __attribute__((deprecated))
Zekel
Curiosamente, o Xcode não me avisa sobre o uso de um método marcado como depreciado. Existe um sinalizador do compilador que precisa ser definido?
memmons
No menu suspenso de conclusão de código do Xcode, vejo que o método está marcado como depreciado, mas usá-lo não fornece um aviso ao compilador.
memmons
1
Configurações @Answerbot Construir> alertar sobre funções obsoletas ... definido para SIM
bandeja paisa
como adicionar o método alternativo que deve ser usado?
OXXY
135

IMHO, é mais fácil escrever __ obsoleto:

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

Funciona também nas aulas

__deprecated
@interface MyDeprecatedClass

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

@end
Víctor B.
fonte
2
Muito melhor maneira de fazer isso.
SG1
1
Nenhuma descrição é fornecida, portanto você não saberá se deve usar um método diferente ou o que ... #
11154
1
#define __deprecated __attribute __ ((obsoleto))
Parag Bafna
Por que é melhor que DEPRECATED_ATTRIBUTE? Só porque é mais curto ou existe alguma diferença real?
kelin 28/04
88

Se você deseja enviar uma mensagem adicional com o sinalizador de descontinuação, use os seguintes sinalizadores.

@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 os sinalizadores mencionados acima, você pode dizer por que está descontinuando ou qual o método que o desenvolvedor deve usar no futuro.

uiroshan
fonte
2
Prefiro ter uma mensagem com um aviso de descontinuação. É muito mais útil para novos usuários de uma API. Então, acho que essa é a melhor resposta.
johnnieb
Eu gosto mais dessa resposta, sendo a mais clara e fácil de usar com copiar e colar exatamente o que eu preciso. Você também pode aprimorá-lo com uma amostra de descontinuação de um método? uma classe inteira? É feito exatamente da mesma maneira?
Motti Shneor 6/11/19
15

Para marcar um método como obsoleto, use __attribute __ ((obsoleto ("Sua mensagem vai aqui"))))

Um exemplo prático, de 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
onmyway133
fonte
14

Use o deprecatedatributo:

- (int)bar: (int)x __attribute__((deprecated));
Stephen Canon
fonte