Cómo desaprobar un método en Xcode

79

Tenemos nuestra biblioteca que enviamos a nuestros clientes y me gustaría marcar algunos métodos como "obsoletos" porque los cambiamos (como lo hace Apple en el SDK de iPhone).

He visto la __OSX_AVAILABLE_BUT_DEPRECATEDmacro del preprocesador, que está asignada __AVAILABILITY_INTERNAL, que está asignada a __attribute__((deprecated))...

Bueno, estoy un poco confundido con estas cosas.

¿Alguien sabe algo sobre eso?

Julien
fuente

Respuestas:

150

__attribute__((deprecated))es la forma gcc (también admitida en 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 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 el de los métodos Objective-C sería

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

También puede marcar toda la clase como obsoleta con

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

Apple también proporciona el <AvailabilityMacros.h>encabezado 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á usando Swift, usa el @availableatributo para desaprobar un artículo, por ejemplo

@available(*, deprecated=2.0, message="no longer needed")
func f() {
    ...
}
Kennytm
fuente
Gracias por esta respuesta rápida, estoy bastante seguro de que ayudará, busqué un tiempo antes de preguntar :)
Julien
1
Solo tengo otra pregunta: ¿es posible agregar un mensaje como "Use el método XXX en su lugar"?
Julien
22
@Julien: Sí: __attribute((deprecated(use method XXX instead))). Pero esta sintaxis solo está disponible a partir de gcc 4.5, y la versión enviada con Xcode es 4.2 ...
kennytm
Si agrego un atributo obsoleto solo a la declaración del método, el compilador dice "Los atributos en la implementación del método y su declaración deben coincidir". ¿Necesito agregar algo a la implementación del método?
Borut Tomazin
2
Esta no debería ser la respuesta aceptada. No es así como lo hace Apple, y es mucho más feo queDEPRECATED_ATTRIBUTE
Adlai Holler
74

También puede utilizar una definición más legible DEPRECATED_ATTRIBUTE

Se definió en usr/include/AvailabilityMacros.h:

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

Ejemplo de métodos de Objective-C :

@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 obsoleta:

DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end
skywinder
fuente
2
Así lo hace Apple también en las clases de iOS. Probablemente el mejor método.
LunaCodeGirl
2
Definitivamente es el mejor método. Lástima que no sea la respuesta seleccionada o la respuesta más votada.
Benjohn
¿Cómo puedo usar DEPRECATED_MSG_ATTRIBUTEpara marcar una clase como obsoleta con un mensaje (como UIAlertView)
Multinerd
1
¿Existe el concepto de 'renombrado' similar a los atributos disponibles en Swift?
Joe Susnick
5

Swift 5.0

Depreciar cualquier método / clase / estructura / protocolos usando @available

@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }

@available(*, deprecated, renamed: "loadData")
func fetchData() { }

@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }

@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")

Posibles parámetros:

  • introducido
  • obsoleto
  • obsoleto
  • mensaje
  • renombrado

Para obtener más información, consulte el documento de apple: Atributos

Lal Krishna
fuente
0

- PARA CÓDIGO SWIFT:

Pon esto justo encima del método: @available(*, deprecated: <#Version#>, message: <#Message#>)

ejemplo:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
Mojtaba Hosseini
fuente