2010-01-17 16 views
12

Cuál es la importancia del posicionamiento de la palabra claveImportancia const posicionamiento de palabras clave en las declaraciones de variables

const 

al declarar una variable en Objective-C, por ejemplo:

extern const NSString * MY_CONSTANT; 

frente

extern NSString * const MY_CONSTANT; 

El uso de la primera versión en asignaciones produce advertencias sobre "calificadores fr om puntero tipo de destino "se descarta así que estoy asumiendo que la segunda versión asegura que la dirección del puntero sigue siendo la misma. Realmente apreciaría una respuesta más definitiva. ¡Muchas gracias de antemano!

Respuesta

13

En el primer caso, declara un puntero mutable a un objeto inmutable const NSString, mientras que en el segundo caso, declara un puntero inmutable a un objeto mutable NSString.

Una manera fácil de recordar esto es mirar dónde se encuentra el *; todo lo que queda a la izquierda es del tipo "pointee", y todo a la derecha describe las propiedades del puntero.

+2

ezod es correcto - Sin embargo, no veo el razonamiento al agregar la const, cuando un NSString se declara como una constante de cadena. No puede liberar un NSString y no puede cambiarlo (no es mutable) ... entonces ¿por qué molestarse con la const? –

+4

Nadie usa 'const NSString * blah' porque incluso un NSString inmutable podría necesitar manipular sus ivars (por ejemplo, el almacenamiento en caché), y un NSString también podría ser un NSMutableString. Usas 'NSString * const blah' para que parte de tu otro código no lo haga' if (MY_CONST_STRING = local_string) 'y un complemento malicioso no pueda reescribir todas tus constantes para que sea' @ "I LIKE MONKEYS" '. –

5

En general, const siempre se aplica al token justo antes del const. En el segundo caso, el const significa que el puntero es una constante, no el objeto señalado. La excepción es cuando el const aparece antes de cualquier cosa que pueda ser significativamente constante, como en el primer ejemplo. En este caso se aplica al primer tipo, en este caso NSString, por lo que su equivalente a extern NSString const * MY_CONSTANT

+0

Ojalá pudiera establecer dos respuestas aceptadas, ambas me han ayudado a entender esto. Muchas gracias chicos! –

6
extern const NSString * MY_CONSTANT; 

- Puntero es variable, pero los datos apuntados por el puntero es constante.

extern NSString * const MY_CONSTANT; 

- Puntero constante, pero los datos apuntados por el puntero no es constante.

Cuestiones relacionadas