2012-07-11 16 views
12

Ho bisogno di deprecare un singolo metodo nel protocollo obiettivo-c. Sui metodi standard di classe/istanza aggiungo __attribute__ ((deprecated)); dopo la dichiarazione.__attribute__ ((deprecato)) non funziona sui metodi del protocollo obiettivo-c?

Sembra che non funzioni sui metodi di protocollo. Se li contrassegno deprecati e li uso da qualche parte, il progetto viene compilato correttamente, senza preavviso di deprecazione.

È un difetto in Apple LLVM 3.1 o sto facendo qualcosa di sbagliato?

+0

Ciò si verifica ancora in LLVM 5.0. Sebbene il compilatore non mostri un avvertimento, attraversa il metodo con una linea rossa quando usa il completamento automatico Xcode. Qualche parola su questo? –

risposta

7

Anche se le risposte qui forniscono alcune ottime informazioni, sono obsolete. A partire da Xcode 5.0 e LLVM 5.0 sembra che gli avvisi di deprecazione per i metodi del protocollo Objective-C siano riconosciuti. In sede di attuazione del metodo, Xcode 5 lo contrassegna:

Attenzione: metodo di implementazione deprecato

qui sono i passi che ho usato per la produzione di un avviso di disapprovazione per l'attuazione di un metodo di protocollo deprecato:

  1. Contrassegnare il metodo di protocollo come deprecato utilizzando __deprecated. Dalla nuova documentazione di SDK 7.0:

    __deprecated causes il compilatore per generare un avviso quando incontra un codice che utilizza la funzionalità deprecata. __deprecated_msg() fa lo stesso, e i compilatori che lo supportano stamperanno un messaggio insieme all'avviso di deprecazione. Potrebbe essere necessario attivare questo avviso con il flag -Wdeprecated. __deprecated_enum_msg() deve essere utilizzato su enumerazioni e i compilatori che lo supportano stamperanno l'avviso di deprecazione.

    #define __deprecated __attribute__((deprecated)) 
    

    deprecare il metodo, fare qualcosa di simile:

    - (void)aDeprecatedProtocolMethod __deprecated; 
    

    Questo da solo dovrebbe essere sufficiente per Xcode per visualizzare un avviso di disapprovazione. Tuttavia, dovresti seguire i prossimi passi (sapendo che Xcode può essere molto schizzinoso a volte) per assicurare le visualizzazioni di avvertimento.

  2. Aggiungere un commento di documentazione con un tag di avviso di ritiro. Vedere l'esempio di codice qui sotto per imparare:

    /** 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. Pulire il progetto ( + + K) e quindi creare il progetto ( + B) - solo perché Xcode può essere funky a volte.

sono sicuro al 100% quando o dove questa funzione è stata introdotta (magari con SDK 7.0 e 10.9, o Xcode 5.0/5.0.1, oppure con LLVM 5.0) - ma funziona comunque.

3

Apple ha sconsigliato alcuni metodi nel protocollo UITableViewDelegate, forse sarete in grado di trovare la soluzione utilizzando il codice Apple come esempio.

Il codice rilevante del protocollo è il seguente:

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

Come si può vedere, Apple utilizza una macro. Forse questa è la strada da percorrere?

EDIT: Come rilevato sul link seguente [1] __attribute__((deprecated)) è un costrutto GCC quindi questo potrebbe non funzionare in LLVM. Immagino che questo sia il motivo per cui Apple usa le macro, quindi verrà chiamato un altro costrutto di deprecazione (o no) quando vengono utilizzati altri compilatori.

[1] How to deprecate a method in Xcode

+0

La macro si espande in '__attribute __ ((availability (ios, introduction = 2.0, deprecated = 3.0)))'. Vedi in 'Availability.h' e' AvailabilityInternal.h' (entrambi in '/ usr/include /') – JustSid

+0

Sì, parlano di GCC, ma __attribute __ ((deprecato)) funziona effettivamente su Apple LLVM, ad eccezione dei protocolli. È confuso al momento. –

4

Beh, ho appena realizzato, che anche Apple utilizzano __attribute__((deprecated)) alla fine. E non funziona neanche. Se utilizzo un metodo delegato deprecato, ad es.

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

non c'è avviso.

Quindi sembra un candidato per il radar.

EDIT: Archiviato un radar, Bug ID # 11849771.

+0

eventuali aggiornamenti su 'ID bug # 11849771'? – Vasu

+0

sfortunatamente, no –

Problemi correlati