2012-04-11 8 views
6

Ho appena controllato le risposte here ma non ho aiutato. Quando aggiungo un attributo deprecato solo alla dichiarazione del metodo rispetto al compilatore dice Attributes on method implementation and its declaration must match. Devo aggiungere smth all'implementazione del metodo?Come deprecare appropriatamente un metodo in Xcode 4

Grazie!

risposta

13

Basta aggiungere l'attributo alla dichiarazione:

@interface Blah 
- (void)method __attribute__((deprecated)); 
@end 

a condizione che il include siano corrette per la traduzione, questo dovrebbe funzionare bene. Forse hai aggiunto l'attributo alla definizione , non alla dichiarazione ? Altrimenti, una dimostrazione (esempio di codice) sarebbe d'aiuto.

Aggiornamento

Anche se l'approccio di cui sopra funziona per i messaggi tipici, sembra clang si confonde con IBAction s.

Con clang, gli attributi ibaction sono inseriti implicitamente (per quello che precedentemente era un typedef).

Quando l'attributo è specificato nella dichiarazione unica, l'uscita del preprocessore è la seguente:

// preprocessed declaration 
- (void)__attribute__((ibaction))setSomething:(id)sender __attribute__((noreturn)); 
// preprocessed implementation 
- (void)__attribute__((ibaction))setSomething:(id)sender 
...  

Così, sembra che il compilatore è solo confuso da questa decorazione nascosta, e si deve anche aggiungere l'attributo a l'implementazione/definizione per sopprimere l'avviso quando il metodo è un IBAction.

+0

Questo non funziona! –

+0

Funziona sulla mia macchina;) Inserisci il tuo codice! – justin

+0

- (IBAction) showTag __attribute __ ((deprecato)); Ho capito: gli attributi sull'implementazione del metodo e la sua dichiarazione devono coincidere. –

0

Devi mettere l'attributo deprecato sia sulla dichiarazione che sull'implementazione del metodo, almeno in Xcode 4.3.2 con clang.

+0

Questo è corretto. Ma perché? –

+0

Shrug. Immagino lo abbiano implementato in modo diverso in clang che in gcc. –