2012-03-03 19 views
7

La convención con categorías debe incluir un prefijo al extender las clases de Apple. Por ejemplo:¿Cuál es la convención para prefijar categorías con palabras mágicas?

[string XXDataUsingUTF8]; 

(Sí, es un ejemplo estúpida Sígueme el rollo..)

Lo que estoy a menos claro en es lo que la convención es cuando el identificador comienza con copy, set, init o new.

Por ejemplo:

[request setHTTPBodyWithKeyValues: keyValues]; 

Si añado mi prefijo, esto ya no sigue las "incubadoras comienzan con juego de" convención.

[request XXSetHTTPBodyWithKeyValues: keyValues]; 

Por otro lado, si añado el prefijo después de la puesta, que ya no es realmente un prefijo:

[request setXXHTTPBodyWithKeyValues: keyValues]; 

Ésta no es la importación terriblemente con set, pero creo que se vuelve más importante con init, copy, etc.

¿Apple ha documentado esto en cualquier lugar? ¿Qué es de uso común?

+2

No he visto ningún directrices oficiales sobre esto, pero en aras de no confundir ARC o el analizador estático LLVM, o cualquier otra herramientas o humanos que leen su código, optaría por mantener intacto el prefijo convencional al inicio del selector. Personalmente, utilizo un guión bajo en los nombres de los métodos de extensión de categoría, ya que los métodos "reales" nunca contienen uno, preservando así la singularidad del "prefijo". En su ejemplo, sería 'setXX_HTTPBodyWithKeyValues:'. En los métodos de extensión no basados ​​en convenciones, eso simplemente se convierte en 'XX_myMethodName'. – pmdj

+0

Supongo que esta es realmente la única respuesta * práctica *, ¿no? Gracias por señalar lo obvio. :) –

+1

¡Punto muy interesante! A algunas personas les gusta postfixar su cadena de "espacio de nombres": 'setHTTPBodyWithKeyValues_XX:' que no es más bonita. –

Respuesta

11

También podemos establecer la familia método explícitamente en la declaración de interfaz:

@interface NSObject (StevenFisherCategory) 

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

@end 
+0

Este es un punto excelente. Este es definitivamente el enfoque para usar en el futuro con Xcode 4.3 y más tarde usando LLVM, especialmente con ARC. –

+1

Gran respuesta. Estaba intentando descubrir cómo hacer funcionar mi método init prefijado. '' '__attribute __ ((objc_method_family (init)))' '' hizo el truco – edelaney05

Cuestiones relacionadas