USO #define:
no puede depurar el valor de identificador
trabajo con #define y otras macros es un trabajo de pre-procesador, al llegar a Build/Run primera se puede procesar previamente el código fuente, que trabajará con todas las macros (comenzando con el símbolo #),
Supongamos, que ha creado,
#define LanguageTypeEnglish @"en"
y se utiliza esto en 2 lugares en su código.
NSString *language = LanguageTypeEnglish;
NSString *languageCode = LanguageTypeEnglish;
que reemplazará "LanguageTypeEnglish" con @"en"
, en todos los lugares. De modo que se generarán 2 copias de @"en"
. es decir
NSString *language = @"en";
NSString *languageCode = @"en";
Recuerde, hasta que este proceso, compilador no está en la imagen.
Después de preprocesamiento todas las macros, compilador viene en la imagen, y se obtendrá el código de entrada de este tipo,
NSString *language = @"en";
NSString *languageCode = @"en";
y compilarlo.
USANDO estática:
respeta alcance y es de tipo seguro. puede depurar el valor de identificador
Durante el proceso de compilación si el compilador encuentra,
static NSString *LanguageTypeRussian = @"ru";
entonces se comprobará si la variable con el mismo nombre almacenado previamente, si es así, sólo pasar el puntero de esa variable, si no, creará esa variable y pasará su puntero, la próxima vez solo pasará el puntero de la misma.
Por lo tanto, utilizando estático, solo se genera una copia de la variable dentro del alcance.
La unión constante de cadenas es el trabajo del compilador, no del enlazador. – kennytm
Esto no es correcto. Objective-c usa [String Interning] (https://en.wikipedia.org/wiki/String_interning) como se describe [aquí] (http://nshipster.com/equality/). '# define' does _not_ store una copia de la cadena para cada uso. Y @kennytm tiene razón, el compilador hace eso, no el enlazador –
@ AndréFratelli De hecho, la fusión constante de cadenas es una optimización de enlazadores, y se implementa mediante el enlazador estático en OS X/macOS para C y CF/NSStrings . No se hace mediante el uso de cadenas, y el compilador no lo hace (aunque el compilador puede unir cadenas antes de escribir el archivo objeto que está generando). Puede ver el código que hace esto en [las fuentes del enlazador] (http://opensource.apple.com/source/ld64/ld64-264.3.102/). Entonces, no, kennytm no está bien; realmente es el engarce. – alastair