2012-01-13 16 views
6

Definí una macro MYMACRO. Nota: el valor no es un NSString válido.¿Cómo expandir un MACRO en NSString sin usar ninguna concatenación de cadenas en tiempo de ejecución?

#define MYMACRO is 

La macro se utiliza dentro la declaración de un NSString

@"This MYMACRO fun" 

Sin embargo, el preprocesador no se expande la macro. El resultado preprocesado es

@"This MYMACRO fun" 

La mejor solución que encontrado hasta ahora para conseguir la macro para expandir es:

#define MYMACRO @"is" 
@"This "[email protected]" fun" 

La macro se expande como por debajo del cual es una sintaxis Objective-C válido:

@"This "@"is"@" fun" 

Sin embargo, esto requiere 2 concatenaciones en tiempo de ejecución.

Así que mi pregunta es cómo insertar una macro en un NSString sin usar ninguna concatenación de cadenas en el tiempo de ejecución?

Idealmente, me gustaría que el tiempo de ejecución ejecutar @"This is fun" en lugar de @"This "@"is"@" fun"

Respuesta

6

Estoy bastante seguro de lo que tiene ya está concatenando en tiempo de compilación y no en tiempo de ejecución.

+1

Usted está correcto. Si genera el ensamblado para el código que hace la concatenación de esta manera, puede ver que termina como una cadena .asciiz. – UIAdam

+0

Creo que también vale la pena agregar que incluso si la concatenación sucedió en el tiempo de ejecución, no vale la pena agacharse para escribir algo de macro feo solo para guardar algunas operaciones de cadena. Primero escriba un código claro y luego preocúpese por el rendimiento. Personalmente, estaría buscando usar stringWithFormat para insertar un NSString dentro de otro. – UIAdam

+0

@AdamW: ¿Quiere decir que el compilador optimiza @ "Este" @ "es" @ "divertido" en @ "Esto es divertido" en tiempo de compilación? Estoy de acuerdo con usted, prefiero tener un código fuente simple en lugar de guardar algunas operaciones de cadena. Estoy cayendo en una optimización prematura y todos sabemos lo que significa: "La optimización prematura es la raíz de todo mal - D. Knuth" –

-2
#define MYMACRO @"is" 
[NSString stringWithFormat:@"This %@ fun",MYMACRO] 
Cuestiones relacionadas