2012-07-11 7 views
12

Necesito desaprobar un único método en el protocolo objetivo-c. En los métodos normales de clase/instancia agrego __attribute__ ((deprecated)); después de la declaración.__attribute__ ((obsoleto)) no funciona en los métodos de protocolo objetivo-c?

Parece que no funciona en los métodos de protocolo. Si los marco como obsoletos y los utilizo en algún lugar, el proyecto compila OK, sin la advertencia de obsolescencia esperada.

¿Es un defecto en Apple LLVM 3.1, o estoy haciendo algo mal?

+0

Esto todavía ocurre en LLVM 5.0. Aunque el compilador no muestra una advertencia, tacha el método con una línea roja cuando usa Xcode autocompletar. ¿Alguna palabra sobre esto? –

Respuesta

7

Aunque las respuestas aquí proporcionan información muy buena, que son obsoletas. Comenzando con Xcode 5.0 y LLVM 5.0 parece que se reconocen las advertencias de depreciación para los métodos de protocolo Objective-C. Cuando se ejecuta el método, Xcode 5 banderas de TI:

Advertencia: Implementación obsoleto método

Estos son los pasos que he utilizado para producir una advertencia de desaprobación para la implementación de un método de protocolo en desuso:

  1. Marque el método de protocolo como obsoleto usando __deprecated. De la nueva documentación de SDK 7.0:

    __deprecated causes el compilador produce una advertencia al encontrar el código que usa la funcionalidad obsoleta. __deprecated_msg() hace lo mismo, y los compiladores que lo soportan imprimirán un mensaje junto con la advertencia de desactivación. Esto puede requerir activar dicha advertencia con el indicador -Wdeprecated. __deprecated_enum_msg() se debe utilizar en enumeraciones, y los compiladores que lo admitan imprimirán la advertencia de desactivación.

    #define __deprecated __attribute__((deprecated)) 
    

    desaprobar su método, hacer algo como esto:

    - (void)aDeprecatedProtocolMethod __deprecated; 
    

    Esto por sí solo debería ser suficiente para Xcode para que aparezca una advertencia de desaprobación. Sin embargo, debe seguir los siguientes pasos (sabiendo que Xcode puede ser muy quisquilloso a veces) para garantizar que se muestren las advertencias.

  2. Agregue un comentario de documentación con una etiqueta de advertencia de desactivación. Vea el ejemplo de código siguiente para saber cómo:

    /** Describe the method here - what does it do, how does it work, etc. Very brief. 
        @deprecated This delegate method is deprecated starting in version 2.0, please use otherMethodNameHere:withAnExtraParameter: instead. */ 
    - (void)aDeprecatedProtocolMethod __deprecated; 
    
  3. Limpiar el proyecto ( + + K) y luego construir el proyecto ( + B) - sólo porque Xcode puede ser original a veces.

No estoy 100% seguro de cuándo o dónde se introdujo esta característica (tal vez con SDK 7.0 y 10.9, o Xcode 5.0/5.0.1, o con LLVM 5.0) - pero funciona, no obstante.

3

Apple desaprobó algunos métodos en el protocolo UITableViewDelegate, quizás pueda encontrar la solución usando el código de Apple como ejemplo.

El código relevante del protocolo es el siguiente:

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView 
     accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 
__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0); 

Como se puede ver, Apple utiliza una macro. Quizás este es el camino a seguir?

EDIT: Como se observa en el siguiente enlace [1] __attribute__((deprecated)) es una construcción GCC por lo que podría no funcionar en LLVM. Supongo que esta es la razón por la que Apple usa macros, por lo que se llamará a otra (o ninguna) construcción de desaprobación cuando se usen otros compiladores.

[1] How to deprecate a method in Xcode

+0

La macro se expande a '__tribuir __ ((disponibilidad (ios, introducido = 2.0, obsoleto = 3.0)))'. Consulte en 'Availability.h' y' AvailabilityInternal.h' (ambos en '/ usr/include /') – JustSid

+0

Sí, hablan de GCC, pero __attribute __ ((obsoleto)) realmente funciona en Apple LLVM, excepto para los protocolos. Es confuso en este momento. –

4

Bueno, me acabo de dar cuenta, que incluso Apple utilizan __attribute__((deprecated)) al final. Y tampoco funciona. Si utilizo cualquier método delegado en desuso, p.

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView 
    accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 

no hay advertencia.

Parece un candidato para el radar.

EDITAR: se presenta un radar, Bug ID # 11849771.

+0

cualquier actualización sobre 'Bug ID # 11849771'? – Vasu

+0

lamentablemente, no –

Cuestiones relacionadas