¿Qué representa el símbolo @ en el objetivo-c?

141

Estoy aprendiendo el objetivo-c y sigo tropezando con el símbolo @. Se utiliza en diferentes escenarios, por ejemplo al comienzo de una cadena o para sintetizar métodos de acceso.

¿Qué significa el símbolo @ en el objetivo-c?

Benedict Cohen
fuente
¿Por qué @ se usa antes de @interface y @end?
Lalit Kumar

Respuestas:

159

El @carácter no se usa en identificadores C o C ++, por lo que se usa para introducir palabras clave del lenguaje Objective-C de una manera que no entre en conflicto con las palabras clave de los otros lenguajes. Esto permite que la parte "objetiva" del lenguaje se mezcle libremente con la parte C o C ++.

Por lo tanto, con muy pocas excepciones, cada vez que vea @en algún código Objective-C, está viendo construcciones Objective-C en lugar de construcciones C o C ++.

Las principales excepciones son id, Class, nil, y Nil, que generalmente son tratados como palabras clave del lenguaje a pesar de que puede disponer de una typedefo #definedetrás de ellos. Por ejemplo, el compilador realmente trata idespecialmente en términos de las reglas de conversión de tipo de puntero que aplica a las declaraciones, así como a la decisión de generar barreras de escritura GC.

Otras excepciones son in, out, inout, oneway, byref, y bycopy; Estos se utilizan como anotaciones de clase de almacenamiento en parámetros de método y tipos de retorno para hacer que los objetos distribuidos sean más eficientes. (Se convierten en parte de la firma del método disponible desde el tiempo de ejecución, que puede mirar a la DO para determinar la mejor manera de serializar una transacción.) También están los atributos dentro de @propertylas declaraciones, copy, retain, assign, readonly, readwrite, nonatomic, getter, y setter; esos solo son válidos dentro de la sección de atributos de una @propertydeclaración.

Chris Hanson
fuente
44
¿Puedes explicar algo sobre lo que hace @ (expresión)? Es el único elemento que no entiendo en la ventana emergente que se muestra cuando escribo @ en xcode.
jchnxu
10
@ (99) es lo mismo que [NSNumber numberWithInteger: 99]. @ (YES) es lo mismo que [NSNumber numberWithBool: YES]. El signo @ es un atajo para crear objetos.
JoJo
77
¿Alguien más está confundido por el hecho de que esta "respuesta" realmente no responde la pregunta planteada? El autor de la pregunta dice "¿qué significa '@' en Objective-C?" y el respondedor dice "Significa que estás usando Objective-C". Creo que él ya lo sabía ...
Jon McClung
1
Una especie de arbitrario; tenía que estar en el conjunto ASCII base y no haber sido usado por C cuando se estaba escribiendo el primer preprocesador Objective-C. Por eso es @.
Chris Hanson el
1
Jon McClung: Leo tiene razón, no hay un "significado más profundo". El @personaje no fue utilizado por C, por lo que fue una conveniente "escotilla de escape" para el análisis alternativo que también conserva el 100% de compatibilidad con el código C existente.
Chris Hanson el
63

Del tutorial de Objective-C: El símbolo @ , la razón por la que está en el frente de varias palabras clave:

El uso de @ debería facilitar la conexión de un compilador de Objective-C a un compilador de C existente. Debido a que el @ no es válido en ningún contexto en C excepto un literal de cadena, el tokenizer (un paso temprano y simple en el compilador) podría modificarse para simplemente buscar el carácter @ fuera de una constante de cadena (el tokenizer entiende los literales de cadena , por lo que está en condiciones de distinguir esto). Cuando se encuentra @, el tokenizer pondría al resto del compilador en "modo Objective-C". (El analizador Objective-C sería responsable de devolver el compilador al modo C normal cuando detecte el final del código Objective-C).

Además, cuando se ve delante de un literal de cadena, hace un NSString en lugar de un 'char *' en C.

thelsdj
fuente
24

De Macrumors: Tutorial de Objective-C , frente al literal de cadena:

También hay literales @ "" NSString. Es esencialmente una forma abreviada del método NSString + stringWithUTF8String.

El @ también agrega soporte unicode a las cadenas C.

Van Nguyen
fuente
12
"Es esencialmente una forma abreviada del método NSString + stringWithUTF8String". Bueno no exactamente. Las cadenas se asignan estáticamente, lo que las hace diferentes de +[NSString stringWithUTF8String:](las que se asignan dinámicamente), y liberar y retener no tienen ningún efecto sobre ellas.
16

Desde el manual :

Los marcos de Objective-C generalmente no usan cadenas de estilo C. En cambio, pasan cadenas como objetos NSString.

La clase NSString proporciona un contenedor de objetos para cadenas que tiene todas las ventajas que esperaría, incluida la administración de memoria incorporada para almacenar cadenas de longitud arbitraria, soporte para Unicode, utilidades de formato de estilo printf y más. Sin embargo, debido a que tales cadenas se usan comúnmente, Objective-C proporciona una notación abreviada para crear objetos NSString a partir de valores constantes. Para usar esta abreviatura, todo lo que tiene que hacer es preceder una cadena normal entre comillas dobles con el símbolo @, como se muestra en los siguientes ejemplos:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
pabloelustondo
fuente
3
Pero este es solo un ejemplo de dónde @se usa. Estoy mirando un código como este: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... nada que ver con NSString
GreenAsJade