2009-09-18 8 views
37

Qualcuno sa come fare?Come si contrassegna una funzione come deprecata in un file di intestazione dell'obiettivo C iPhone?

Sto indovinando ci sono solo alcune parole chiave che posso attaccare dopo la funzione da qualche parte?

EDIT: Vorrei che venga generato un avviso del compilatore se qualcuno tenta di utilizzare la funzione deprecata, simile al comportamento visto nelle API di Apple.

Cheers! Nick.

+0

Hey gs - buon commento. In realtà stavo pensando questo solo ora! –

risposta

60

Prova aggiungendo un attributo alla vostra metodo dichiarazione:

- (void)fooBar __attribute__ ((deprecated));

Tratto da here.

+1

Sembra una sintassi abbastanza brutta - ma se funziona, funziona! Grazie Tim. –

+3

è possibile _ # definire DEPRECATED _____attribute_____ ((deprecato)) _ –

+15

- (void) fooBar DEPRECATED_ATTRIBUTE; per me va bene. Non penso che tu abbia bisogno del #define come suggerito da Denis, è già definito AFAIK – pshah

2

Da SFAuthorization.h di Apple:

/*! 
DEPRECATED: Use obtainWithRight:flags:error: 
@method permitWithRight:flags: 
@abstract Call permitWithRight to gain a right to have 
      access to a privilege operation. 
@param rightName The name of an authorization right. 
@param flags Authorization flags. 
*/ 
- (OSStatus)permitWithRight:(AuthorizationString)rightName 
         flags:(AuthorizationFlags)flags; 

Se non si utilizza un costruttore di documentazione automatizzata direi che qualcosa di simile a questo è sufficiente:

- (void)doSomething;   /* DEPRECATED */ 
+0

Grazie per il commento. Se utilizzo la funzione 'allowWithRight' in SFAuthorization, viene visualizzato un avviso del compilatore ... C'è un modo per aggiungere un flag di deprecazione per fornire gli avvertimenti del compilatore? –

+0

È possibile utilizzare il comando #warning del preprocessore, ma non è standard e probabilmente non funziona in tutti i compilatori. Vedi http://stackoverflow.com/questions/171435/portability-of-warning-preprocessor-directive –

2

Si potrebbe anche seguire il HeaderDoc manual. Dove viene utilizzata questa sintassi:

/*! 
* @abstract Foo is good for bar. 
* 
* @deprecated in version 2.0 
*/ 
7

La risposta di Tim genera effettivamente un avviso del compilatore; le altre versioni sono meramente commenti che non hanno alcun effetto w.r.t. il compilatore.

Se si guarda /usr/include/AvailabilityMacros.h, si vedrà come Apple fa questo. Tale intestazione utilizza __attribute__((deprecated)) e __attribute__((unavailable)) a seconda che l'API sia presente ma deprecata o che sia stata effettivamente rimossa dal sistema operativo.

3

Invece di __attribute__((deprecated)), è possibile utilizzare utilizzare le macro definite in <cdefs.h>:

- (void)fooBar __deprecated; 
// Or better: 
- (void)fooBar __deprecated_msg("Use barFoo instead."); 

In alternativa è possibile utilizzare le macro definite in <AvailabilityMacros.h>:

- (void)fooBar DEPRECATED_ATTRIBUTE; 
// Or better: 
- (void)fooBar DEPRECATED_MSG_ATTRIBUTE("Use barFoo instead."); 

Se si utilizza Objective-C, si non fa alcuna differenza visto che userete un compilatore moderno, quindi potete usare la sintassi breve di Apple __deprecated_msg(). Ma se usi C per piattaforme multipiattaforma, allora DEPRECATED_MSG_ATTRIBUTE() utilizza le definizioni di disponibilità ottimali (ad esempio, supporta GCC3.1).

Problemi correlati