Que représente le symbole @ dans objective-c?

141

J'apprends l'objectif-c et je continue de heurter le symbole @. Il est utilisé dans différents scénarios, par exemple au début d'une chaîne ou pour synthétiser des méthodes d'accesseurs.

Que signifie le symbole @ dans objective-c?

Benoît Cohen
la source
pourquoi @ est-il utilisé avant @interface et @end?
Lalit Kumar

Réponses:

159

Le @caractère n'est pas utilisé dans les identificateurs C ou C ++, il est donc utilisé pour introduire des mots-clés de langage Objective-C d'une manière qui n'entre pas en conflit avec les mots-clés des autres langages. Cela permet à la partie "Objectif" du langage de se mélanger librement avec la partie C ou C ++.

Ainsi, à quelques exceptions près, à chaque fois que vous voyez @dans du code Objective-C, vous regardez des constructions Objective-C plutôt que des constructions C ou C ++.

Les principales exceptions sont id, Class, nilet Nil, qui sont généralement traités comme des mots clés du langage , même si elles peuvent aussi avoir un typedefou #definederrière eux. Par exemple, le compilateur traite en fait idspécialement en termes de règles de conversion de type pointeur qu'il applique aux déclarations, ainsi que de la décision de générer des barrières d'écriture GC.

D' autres exceptions sont in, out, inout, oneway, byrefet bycopy; elles sont utilisées comme annotations de classe de stockage sur les paramètres de méthode et les types de retour pour rendre les objets distribués plus efficaces. (Ils font partie de la signature de la méthode disponible à partir du moteur d' exécution qui ne peut regarder pour déterminer la meilleure façon serialize une transaction.) Il y a aussi les attributs dans les @propertydéclarations, copy, retain, assign, readonly, readwrite, nonatomic, getteret setter; ceux-ci ne sont valides que dans la section attribut d'une @propertydéclaration.

Chris Hanson
la source
4
Pouvez-vous expliquer ce que fait @ (expression)? C'est le seul élément que je ne comprends pas dans la fenêtre contextuelle affichée lorsque je tape @ dans xcode.
jchnxu
10
@ (99) est identique à [NSNumber numberWithInteger: 99]. @ (YES) est identique à [NSNumber numberWithBool: YES]. Le signe @ est un raccourci pour créer des objets.
JoJo
7
Quelqu'un d'autre est-il confus par le fait que cette «réponse» ne répond pas vraiment à la question posée? Le demandeur dit "que signifie« @ »en Objective-C?" et le répondeur dit "Cela signifie que vous utilisez Objective-C." Je pense qu'il en savait déjà autant ...
Jon McClung
1
Sorte d'arbitraire; il devait être dans l'ensemble ASCII de base et pas déjà utilisé par C lorsque le premier préprocesseur Objective-C était en cours d'écriture. Voilà pourquoi c'est @.
Chris Hanson
1
Jon McClung: Leo a raison, il n'y a pas de «sens plus profond». Le @caractère n'était pas utilisé par C, donc c'était une «trappe d'échappement» pratique à l'analyse alternative qui préservait également une compatibilité à 100% avec le code C existant.
Chris Hanson
63

À partir du didacticiel Objective-C: Le symbole @ , la raison pour laquelle il est sur le devant de divers mots-clés:

L'utilisation de @ devrait faciliter le boulonnage d'un compilateur Objective-C sur un compilateur C existant. Étant donné que @ n'est valide dans aucun contexte en C, à l'exception d'un littéral de chaîne, le tokenizer (une étape précoce et simple du compilateur) peut être modifié pour simplement rechercher le caractère @ en dehors d'une constante de chaîne (le tokenizer comprend les littéraux de chaîne , il est donc en mesure de le distinguer). Quand @ est rencontré, le tokenizer mettrait le reste du compilateur en "mode Objective-C". (L'analyseur Objective-C serait responsable du retour du compilateur en mode C normal lorsqu'il détecte la fin du code Objective-C).

De plus, lorsqu'elle est vue devant une chaîne littérale, elle crée une NSString plutôt qu'un 'char *' en C.

thelsdj
la source
24

À partir de Macrumors: Tutoriel Objective-C , devant une chaîne littérale:

Il existe également des littéraux @ "" NSString. C'est essentiellement un raccourci pour la méthode + stringWithUTF8String de NSString.

Le @ ajoute également le support Unicode aux chaînes C.

Van Nguyen
la source
12
"C'est essentiellement un raccourci pour la méthode + stringWithUTF8String de NSString." Eh bien, pas exactement. Les chaînes sont allouées statiquement, ce qui les rend différentes de +[NSString stringWithUTF8String:](celles-ci sont allouées dynamiquement), et la libération et la conservation n'ont aucun effet sur elles.
16

À partir du manuel :

Les frameworks Objective-C n'utilisent généralement pas de chaînes de style C. Au lieu de cela, ils transmettent des chaînes en tant qu'objets NSString.

La classe NSString fournit un wrapper d'objet pour les chaînes qui présente tous les avantages que vous attendez, y compris la gestion de la mémoire intégrée pour le stockage de chaînes de longueur arbitraire, la prise en charge d'Unicode, les utilitaires de formatage de style printf, etc. Étant donné que de telles chaînes sont couramment utilisées, Objective-C fournit une notation abrégée pour créer des objets NSString à partir de valeurs constantes. Pour utiliser ce raccourci, tout ce que vous avez à faire est de faire précéder une chaîne normale entre guillemets du symbole @, comme indiqué dans les exemples suivants:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
pabloelustondo
la source
3
Mais ce n'est qu'un exemple d' @utilisation. Je regarde du code comme celui-ci: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... rien à voir avec NSString
GreenAsJade