Co symbol @ reprezentuje w celu-c?

141

Uczę się celu-c i ciągle wpadam na symbol @. Jest używany w różnych scenariuszach, na przykład na początku łańcucha lub do syntezy metod akcesorów.

Co oznacza symbol @ w celu-c?

Benedict Cohen
źródło
dlaczego @ jest używane przed @interface i @end?
Lalit Kumar

Odpowiedzi:

159

@Znak nie jest używany w identyfikatorach C lub C ++, więc jest on wykorzystywany do wprowadzenia objective-c słowa kluczowe języka w sposób, który nie będzie w konflikcie z kluczowych innych językach. Umożliwia to swobodne mieszanie części języka „Objective” z częścią C lub C ++.

Tak więc, z nielicznymi wyjątkami, za każdym razem, gdy widzisz @jakiś kod Objective-C, patrzysz na konstrukcje Objective-C, a nie konstrukcje C lub C ++.

Głównymi wyjątkami są id, Class, nil, i Nil, które są powszechnie traktowane jako słowa kluczowe językowych, chociaż mogą one również mieć typedeflub #defineza nimi. Na przykład kompilator faktycznie traktuje idspecjalnie pod względem reguł konwersji typów wskaźników, które stosuje do deklaracji, a także decyzji, czy generować bariery zapisu GC.

Inne wyjątki są in, out, inout, oneway, byref, i bycopy; są one używane jako adnotacje do klas magazynu w parametrach metody i typach zwracanych, aby zwiększyć wydajność obiektów rozproszonych. (Stają się częścią podpisu metody dostępne w czasie pracy, który DO może patrzeć na celu ustalenia, w jaki sposób najlepiej serializować transakcję). Istnieje również atrybuty w @propertydeklaracji, copy, retain, assign, readonly, readwrite, nonatomic, getter, i setter; są one ważne tylko w sekcji atrybutów w @propertydeklaracji.

Chris Hanson
źródło
4
Czy możesz wyjaśnić, co robi @ (wyrażenie)? To jedyny element, którego nie rozumiem, w wyskakującym okienku wyświetlanym po wpisaniu @ w xcode.
jchnxu
10
@ (99) to to samo, co [NSNumber numberWithInteger: 99]. @ (YES) to to samo, co [NSNumber numberWithBool: YES]. Znak @ to skrót do tworzenia obiektów.
JoJo
7
Czy ktoś jeszcze jest zdezorientowany faktem, że ta „odpowiedź” tak naprawdę nie odpowiada na zadane pytanie? Pytający mówi „co oznacza '@' w Objective-C?” a odpowiadający mówi: „To znaczy, że używasz Objective-C”. Myślę, że wiedział już tyle ...
Jon McClung
1
Rodzaj arbitralności; musiał znajdować się w podstawowym zestawie ASCII i nie był już używany przez C, kiedy pisano pierwszy preprocesor Objective-C. Dlatego tak jest @.
Chris Hanson,
1
Jon McClung: Leo ma rację, nie ma „głębszego znaczenia”. @Charakter był nieużywany przez C, więc to było wygodne „luk ratunkowy” do alternatywnego parsowania że również zachowaną 100% kompatybilności z istniejącym kodem C.
Chris Hanson,
63

Z samouczka Objective-C: Symbol @ , powód, dla którego znajduje się na początku różnych słów kluczowych:

Użycie @ powinno ułatwić połączenie kompilatora Objective-C z istniejącym kompilatorem C. Ponieważ znak @ nie jest prawidłowy w żadnym kontekście w języku C z wyjątkiem literału ciągu, tokenizer (wczesny i prosty krok w kompilatorze) można zmodyfikować, aby po prostu szukał znaku @ poza stałą ciągu (tokenizer rozumie literały ciągu , więc jest w stanie to rozróżnić). Gdy zostanie napotkany @, tokenizer przestawi resztę kompilatora w „tryb Objective-C”. (Parser celu-C byłby odpowiedzialny za przywrócenie kompilatora z powrotem do zwykłego trybu C, gdy wykryje koniec kodu celu-C).

Również, gdy jest widziany przed literałem ciągu, tworzy NSString zamiast 'char *' w C.

thelsdj
źródło
24

Z Macrumors: Objective-C Tutorial , przed literałem ciągu:

Istnieją również literały @ "" NSString. Jest to zasadniczo skrót od metody stringWithUTF8String NSString.

@ Dodaje również obsługę Unicode do ciągów C.

Van Nguyen
źródło
12
„Jest to zasadniczo skrót od metody stringWithUTF8String NSString”. Cóż, nie do końca. Ciągi są przydzielane statycznie, co sprawia, że ​​różnią się od +[NSString stringWithUTF8String:](są przydzielane dynamicznie), a zwolnienie i zachowanie nie mają na nie żadnego wpływu.
16

Z instrukcji :

Struktury Objective-C zazwyczaj nie używają ciągów w stylu C. Zamiast tego przekazują ciągi znaków jako obiekty NSString.

Klasa NSString zapewnia opakowanie obiektów dla ciągów, które ma wszystkie oczekiwane korzyści, w tym wbudowane zarządzanie pamięcią do przechowywania ciągów o dowolnej długości, obsługę Unicode, narzędzia do formatowania w stylu printf i inne. Ponieważ takie łańcuchy są jednak powszechnie używane, Objective-C zapewnia skróconą notację do tworzenia obiektów NSString ze stałych wartości. Aby użyć tego skrótu, wszystko, co musisz zrobić, to poprzedzić zwykły ciąg w podwójnym cudzysłowie symbolem @, jak pokazano w poniższych przykładach:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
pabloelustondo
źródło
3
Ale to tylko jeden przykład @zastosowania. Patrzę na taki kod: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... nie ma nic wspólnego z NSString
GreenAsJade