2012-03-03 4 views
7

La convenzione con le categorie prevede l'inclusione di un prefisso durante l'estensione delle classi Apple. Per esempio:Qual è la convenzione per il prefisso di categorie con parole magiche?

[string XXDataUsingUTF8]; 

(Sì, è un esempio stupido Just Go With It.).

Cosa sono meno chiare su è ciò che la convenzione è quando l'identificatore inizia con copy, set, init oppure new.

Per esempio:

[request setHTTPBodyWithKeyValues: keyValues]; 

Se posso aggiungere il mio prefisso, questo non segue più le "setter iniziano con set" convenzione.

[request XXSetHTTPBodyWithKeyValues: keyValues]; 

D'altra parte, se aggiungo il prefisso dopo il set, non è più davvero un prefisso:

[request setXXHTTPBodyWithKeyValues: keyValues]; 

Questo non è molto importazione con set, ma penso che diventa più importante con init, copy, ecc.

Apple ha documentato questo ovunque? Cosa c'è in comune?

+2

non ho visto alcun linee guida ufficiali su questo, ma nell'interesse di non confondere ARC o l'analizzatore statico LLVM, o qualsiasi altro strumenti o persone che leggono il tuo codice, opterei per mantenere intatto il prefisso convenzionale all'inizio del selettore. Personalmente, utilizzo un trattino basso nei nomi dei metodi di estensione delle categorie, poiché i metodi "reali" non ne contengono mai uno, preservando così l'unicità del "prefisso". Nel tuo esempio sarebbe 'setXX_HTTPBodyWithKeyValues:'. Nei metodi di estensione basati su non convenzioni, diventa semplicemente "XX_myMethodName". – pmdj

+0

Immagino che questa sia davvero l'unica * pratica * risposta, non è vero? Grazie per aver sottolineato l'ovvio. :) –

+1

Punto molto interessante! Alcune persone amano postfix la loro stringa "namespace": 'setHTTPBodyWithKeyValues_XX:' che non è più carina. –

risposta

11

È possibile impostare il metodo di famiglia esplicitamente nella dichiarazione di interfaccia:

@interface NSObject (StevenFisherCategory) 

- (NSData *)XXCopyDataUsingUTF8 __attribute__((objc_method_family(copy))); 

@end 
+0

Questo è un punto eccellente. Questo è sicuramente l'approccio da utilizzare in futuro con Xcode 4.3 e successivi utilizzando LLVM, in particolare con ARC. –

+1

Ottima risposta. Stavo cercando di capire come far funzionare il mio metodo init prefissato. '' '__attribute __ ((objc_method_family (init)))' '' ha fatto il trucco – edelaney05

Problemi correlati