2011-02-07 9 views
70

Tenemos nuestra biblioteca que enviamos a nuestros clientes, y me gustaría marcar algunos métodos como "en desuso" porque los hemos cambiado (como lo hace Apple en el SDK de iPhone).Cómo descartar un método en Xcode

que he visto la macro __OSX_AVAILABLE_BUT_DEPRECATED pre-procesador, que está asignada a __AVAILABILITY_INTERNAL, que se asigna a __attribute__((deprecated)) ...

Bueno, yo estoy un poco confundido con estas cosas!

¿Alguien sabe algo al respecto?

Respuesta

141

__attribute__((deprecated)) es gcc way (también supported in clang) de marcar una función/método como obsoleto. Cuando uno está marcado como "obsoleto", se producirá una advertencia cada vez que alguien lo llame.

La sintaxis para las funciones normales sería

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

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

y la de los métodos de Objective-C sería

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

También puede marcar toda la clase como obsoletos con

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

Apple también proporciona el encabezado <AvailabilityMacros.h> que proporciona las macros DEPRECATED_ATTRIBUTE y DEPRECATED_MSG_ATTRIBUTE (msg) que se expanden a los atributos anteriores, o nada si el compilador no admite atributos. Tenga en cuenta que este encabezado no existe fuera de OS X/iOS.


Nota al margen, si está utilizando Swift se utiliza el @available attribute desaprobar un elemento, por ejemplo,

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

Gracias por esta respuesta rápida, estoy bastante seguro de que ayudará, he buscado por un tiempo antes de pedir :) – Julien

+1

Sólo tengo otra pregunta: ¿es posible añadir un mensaje como "Usar el método XXX en su lugar"? – Julien

+21

@Julien: Sí: '__attribute ((obsoleto (use el método XXX en su lugar)))'. Pero esta sintaxis está disponible solo a partir de gcc 4.5, y la versión enviada con Xcode es 4.2 ... – kennytm

64

También puede utilizar más legible definirDEPRECATED_ATTRIBUTE

Se define en usr/include/AvailabilityMacros.h:

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

Objective-C métodos ejemplo:

@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 

También puede marcar toda la clase como en desuso:

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

Esta es la forma en que Apple lo hace en las clases de iOS también. Probablemente el mejor método. – LunaCodeGirl

+2

Definitivamente es el mejor método. Lástima que no es la respuesta seleccionada, o la respuesta más votado. – Benjohn

+0

cómo puedo usar 'DEPRECATED_MSG_ATTRIBUTE' para marcar una clase como obsoleta con un mensaje (como UIAlertView) – Multinerd

Cuestiones relacionadas