Was bedeutet das @ -Symbol in Ziel-c?

141

Ich lerne Ziel-c und stoße immer wieder auf das @ -Symbol. Es wird in verschiedenen Szenarien verwendet, beispielsweise am Anfang eines Strings oder zur Synthese von Zugriffsmethoden.

Was bedeutet das @ -Symbol in Ziel-c?

Benedict Cohen
quelle
Warum wird @ vor @interface und @end verwendet?
Lalit Kumar

Antworten:

159

Das @Zeichen wird nicht in C- oder C ++ - Bezeichnern verwendet, daher wird es verwendet, um Objective-C-Sprachschlüsselwörter so einzuführen, dass sie nicht mit den Schlüsselwörtern der anderen Sprachen in Konflikt stehen. Dadurch kann sich der "Objective" -Teil der Sprache frei mit dem C- oder C ++ - Teil vermischen.

Mit sehr wenigen Ausnahmen betrachten Sie jedes Mal, wenn Sie @in einem Objective-C-Code etwas sehen, eher Objective-C-Konstrukte als C- oder C ++ - Konstrukte.

Die wichtigsten Ausnahmen sind id, Class, nil, und Nil, die in der Regel als Sprache Keywords selbst behandelt werden , obwohl sie können auch eine haben typedefoder #definehinter ihnen. Beispielsweise behandelt der Compiler iddie Konvertierungsregeln für Zeigertypen, die er für Deklarationen anwendet, sowie die Entscheidung, ob GC-Schreibbarrieren generiert werden sollen , speziell.

Andere Ausnahmen sind in, out, inout, oneway, byref, und bycopy; Diese werden als Anmerkungen zur Speicherklasse für Methodenparameter und Rückgabetypen verwendet, um verteilte Objekte effizienter zu gestalten. (Sie werden Teil der Methodensignatur zur Verfügung von der Laufzeit, die DO bei bestimmen , wie man am besten serialize eine Transaktion suchen.) Es gibt auch die Attribute innerhalb @propertyErklärungen copy, retain, assign, readonly, readwrite, nonatomic, getter, und setter; Diese sind nur innerhalb des Attributabschnitts einer @propertyDeklaration gültig .

Chris Hanson
quelle
4
Können Sie etwas darüber erklären, was @ (Ausdruck) tut? Es ist das einzige Element, das ich im angezeigten Popup nicht verstehe, wenn ich @ in xcode eingebe.
Jchnxu
10
@ (99) ist dasselbe wie [NSNumber numberWithInteger: 99]. @ (YES) ist dasselbe wie [NSNumber numberWithBool: YES]. Das @ -Zeichen ist eine Verknüpfung zum Erstellen von Objekten.
JoJo
7
Ist noch jemand verwirrt darüber, dass diese "Antwort" die angegebene Frage nicht wirklich beantwortet? Der Fragesteller sagt: "Was bedeutet '@' in Objective-C?" und der Antwortende sagt: "Es bedeutet, dass Sie Objective-C verwenden." Ich denke, er wusste schon so viel ...
Jon McClung
1
Art willkürlich; Es musste sich im Basis-ASCII-Satz befinden und nicht bereits von C verwendet werden, als der erste Objective-C-Präprozessor geschrieben wurde. Deshalb ist es @.
Chris Hanson
1
Jon McClung: Leo hat recht, es gibt keine "tiefere Bedeutung". Das @Zeichen wurde von C nicht verwendet, daher war es eine praktische „Notluke“ zum alternativen Parsen, die auch die 100% ige Kompatibilität mit vorhandenem C-Code bewahrte.
Chris Hanson
63

Aus dem Objective-C-Tutorial: Das @ -Symbol , der Grund, warum es auf der Vorderseite verschiedener Schlüsselwörter steht:

Die Verwendung von @ sollte es einfacher machen, einen Objective-C-Compiler an einen vorhandenen C-Compiler anzuschließen. Da das @ in keinem Kontext in C außer einem Zeichenfolgenliteral gültig ist, kann der Tokenizer (ein früher und einfacher Schritt im Compiler) so geändert werden, dass einfach nach dem @ -Zeichen außerhalb einer Zeichenfolgenkonstante gesucht wird (der Tokenizer versteht Zeichenfolgenliterale , so ist es in der Lage, dies zu unterscheiden). Wenn @ angetroffen wird, versetzt der Tokenizer den Rest des Compilers in den "Objective-C-Modus". (Der Objective-C-Parser ist dafür verantwortlich, den Compiler wieder in den regulären C-Modus zu versetzen, wenn er das Ende des Objective-C-Codes erkennt.)

Auch wenn es vor einem String-Literal angezeigt wird, wird in C eher ein NSString als ein 'char *' erstellt.

thelsdj
quelle
24

Von Macrumors: Objective-C Tutorial , wenn vor dem String-Literal:

Es gibt auch @ "" NSString-Literale. Es ist im Wesentlichen eine Abkürzung für die + stringWithUTF8String-Methode von NSString.

Das @ fügt C-Strings auch Unicode-Unterstützung hinzu.

Van Nguyen
quelle
12
"Es ist im Wesentlichen eine Abkürzung für die + stringWithUTF8String-Methode von NSString." Nun, nicht genau. Die Zeichenfolgen werden statisch zugewiesen, wodurch sie sich von +[NSString stringWithUTF8String:]denen unterscheiden (diese werden dynamisch zugewiesen), und das Freigeben und Beibehalten hat keine Auswirkungen auf sie.
16

Aus dem Handbuch :

Objective-C-Frameworks verwenden normalerweise keine Zeichenfolgen im C-Stil. Stattdessen übergeben sie Zeichenfolgen als NSString-Objekte.

Die NSString-Klasse bietet einen Objekt-Wrapper für Zeichenfolgen, der alle erwarteten Vorteile bietet, einschließlich integrierter Speicherverwaltung zum Speichern von Zeichenfolgen beliebiger Länge, Unterstützung für Unicode, Formatierungsdienstprogramme im Printf-Stil und mehr. Da solche Zeichenfolgen jedoch häufig verwendet werden, bietet Objective-C eine Kurzschreibweise zum Erstellen von NSString-Objekten aus konstanten Werten. Um diese Kurzform zu verwenden, müssen Sie lediglich einer normalen Zeichenfolge in doppelten Anführungszeichen das @ -Symbol voranstellen, wie in den folgenden Beispielen gezeigt:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
pabloelustondo
quelle
3
Dies ist jedoch nur ein Beispiel dafür, wo @verwendet wird. Ich sehe Code wie mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),folgt : ... nichts mit NSString zu tun
GreenAsJade