¿Cómo marco un método como obsoleto en Objective-C 2.0?

141

Soy parte de un equipo que desarrolla una aplicación para iPad bastante grande y, como resultado, hemos creado muchas clases diferentes. El problema es que algunos de los métodos ahora son bastante obsoletos y no quiero simplemente eliminarlos todavía, ya que sé que algunas partes del sistema general usan los métodos ... pero hay mejores variantes (más nuevas) disponibles que deberían usarse en cambio (algunos de los antiguos en realidad llaman a los nuevos, pero la interfaz de clase general se está volviendo desordenada).

¿Hay alguna manera de marcar ciertos métodos como depreciados (como @deprecateden Java y [Obsolete]en .NET)?

Veo que Apple usa Availability.h y tiene etiquetas como

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... ¿es esta la única forma de hacerlo (+ ¿es seguro hacer esto en App Store?) o existen alternativas que marcarán una advertencia en Xcode?

Jamie Chapman
fuente

Respuestas:

163

Sintaxis de desaprobación

La sintaxis se proporciona para marcar los métodos como obsoletos:

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

o:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end
Shay Erlichmen
fuente
77
Esta macro tiene sentido para mí, retiene la sensación de la __attribute__sintaxis. #define __deprecated__ __attribute__((deprecated))
zekel
Curiosamente, Xcode no me da ninguna advertencia sobre el uso de un método marcado como depreciado. ¿Hay un indicador del compilador que deba establecerse?
memmons
En el menú desplegable de finalización de código de Xcode, veo que el método está marcado como depreciado, pero su uso no da una advertencia del compilador.
memmons
1
@Answerbot Build settings> advertir sobre funciones obsoletas ...
configúrelo
¿Cómo agregar el método alternativo que se debe utilizar?
OXXY
135

En mi humilde opinión, es más fácil escribir __deprecated:

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

Funciona también en clases.

__deprecated
@interface MyDeprecatedClass

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

@end
Víctor B.
fuente
2
Mucho mejor manera de hacer esto.
SG1
1
No se proporciona descripción, por lo que no se sabe si debe usar método diferente o lo que ...
raistlin
1
#define __deprecated __attribute __ ((obsoleto))
Parag Bafna
¿Por qué es mejor que DEPRECATED_ATTRIBUTE? ¿Solo porque es más corto o hay alguna diferencia real?
Kelin
88

Si desea dar un mensaje adicional con el indicador de desuso, puede usar los siguientes indicadores.

@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 los indicadores mencionados anteriormente, puede decir por qué está despreciando o cuál es el método que el desarrollador debe usar en el futuro.

Uiroshan
fuente
2
Prefiero tener un mensaje con una advertencia de desaprobación. Es mucho más útil para los nuevos usuarios de una API. Entonces, creo que esta es la mejor respuesta.
johnnieb
Me gusta más esta respuesta, ya que es la más clara y fácil de usar con copiar y pegar justo lo que necesito. ¿Podría por favor también mejorarlo con una muestra de despreciar un método? toda una clase? ¿Se hace exactamente de la misma manera?
Motti Shneor
15

Para marcar un método como obsoleto, use __attribute __ ((obsoleto ("Su mensaje va aquí")))

Un ejemplo práctico, 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
fuente
14

Usa el deprecatedatributo:

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