2011-02-12 23 views
7

de Objective-C tiene como directrices:¿Es posible crear directivas personalizadas en Objective-C?

  • @interface
  • @implementation
  • @end
  • @protocol
  • @property
  • @synthesize

pienso de estas cosas como marcos sofisticados o generadores de códigos. ¿Es posible crear directivas personalizadas para propósitos de generación de código? Un posible uso es generar métodos para CoreData.

Estoy pensando que no, porque nunca he visto nada al respecto, pero mi mundo no es el mundo.


pregunta de seguimiento:

Jonathan menciona a continuación que es posible escribir su propio preprocesador y esto plantea la cuestión de cómo. Actualmente, #define SYMBOLIC_CONSTANT 102 reemplazará todas las instancias de los caracteres SYMBOLIC_CONSTANT con los caracteres 102 en el archivo antes de que los archivos pasen al compilador.

Lo sé XCode usted puede agregar una "Fase de ejecución de script" a un proceso de construcción de objetivos. Así que podría escribir un script para encontrar mis directivas preprocesadas personalizadas como '$ coredata' y luego hacer que el script genere un nuevo archivo que con los caracteres $ coredata reemplazados con algunos caracteres de código. Pero por lo que entiendo del proceso de compilación de XCode, no se pueden enviar archivos alterados a la fase de compilación de orígenes. Los archivos están especificados y bloqueados por el IDE.

¿Alguien ha hecho algo similar? Sé que es posible con un sistema de compilación externo, pero para ser sincero, no estoy en ese nivel de comprensión. No conozco los detalles técnicos de lo que hace el botón Compilar y Ejecutar.

Mientras tanto, voy a empezar a leer XCode Documentación de Apple ...

Gracias por las respuestas!

+0

No dije que fuera remotamente fácil. Sin embargo, algo como '$ coredata' es un token preprocesador de C válido (' $ 'se puede usar en nombres de símbolo/macro), por lo que se puede usar en una instrucción' # define'. De nuevo, sin embargo, si nos dice cuál es su objetivo, podemos sugerir un enfoque más fácil o mejor para el problema. –

Respuesta

3

Su pensamiento es correcto: es imposible hacer esto en su código. La única forma de agregar más @ -directivas es a través del compilador mismo. Incluso si se tomó tantas molestias, casi puedo garantizar que el soporte de resaltado de sintaxis para ellos esté codificado en un archivo de configuración de Xcode en alguna parte.

Ah, y si estaba considerando el uso de una macro preprocesador, entiendo que el carácter @ es ilegal en las macros del preprocesador.

Editar: Ejecuté una prueba, y estoy en lo cierto. El uso del carácter @ en una macro del preprocesador C es ilegal. Siguen la misma regla que los nombres de variables.

+2

No mencioné el uso de una macro de preprocesador. Vuelve a leer mi respuesta. –

3

¿Quiere decir dentro de los límites de Objective-C? No, ya que no tiene forma de reconocer sus nuevas palabras clave. Puede escribir un preprocesador para detectar @whatever y convertirlo en código, pero si nos dice qué desea específicamente hacer, podemos sugerir un enfoque más eficiente u óptimo.

+1

El carácter @ es ilegal en las macros del preprocesador C. –

+0

Gracias por la respuesta. Me diste la idea de cómo hacer esto. Olvidé que no necesita un enganche de idioma para generar código. – Tobias

+2

@Carter: Dije * escriba un preprocesador * no * use el incorporado *. No es que quisiera usar código que requiera su propio preprocesador personalizado. (Oh, espera, uso Objective-C todos los días ...) –

0

No es posible. Estas son palabras clave integradas en el lenguaje Objective-C. El hecho de que haya un @ frente a ellos no los hace diferentes de otras palabras clave.

5

Si bien la respuesta aceptada es correcta, existe una solución parcialmente hacky para este tipo de problema, que adopta la biblioteca libextobjc. Considere this code, encontrará las definiciones como las siguientes existen:

#define weakify(...) \ 
    try {} @finally {} \ 
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__) 

Tal definición permite el uso de weakify palabra clave en la forma siguiente:

id foo = [[NSObject alloc] init]; 
id bar = [[NSObject alloc] init]; 

@weakify(foo, bar); 

El autor de la biblioteca lo explica here:

Dado que las macros están destinadas para ser utilizadas con un @ pre cediéndolas (como @strongify (self);), try {} absorbe el símbolo para que no cause errores de sintaxis.


Actualizado tarde

From now on libextobjc utiliza @autoreleasepool a "tomar el símbolo".

+0

* suspiro, gran explicación con horrible hack-ory – TheCodingArt

Cuestiones relacionadas