Что означает символ @ в объекте-c?

143

Я изучаю objective-c и все время натыкаюсь на символ @. Он используется в разных сценариях, например, в начале строки или для синтеза методов доступа.

Что означает символ @ в objective-c?

Бенедикт Коэн
источник
почему @ используется перед @interface и @end?
Lalit Kumar

Ответы:

159

Этот @символ не используется в идентификаторах C или C ++, поэтому он используется для введения ключевых слов языка Objective-C таким образом, чтобы не конфликтовать с ключевыми словами других языков. Это позволяет «объективной» части языка свободно смешиваться с частью C или C ++.

Таким образом, за очень немногими исключениями, всякий раз, когда вы видите @в каком-либо коде Objective-C, вы смотрите на конструкции Objective-C, а не на конструкции C или C ++.

Основными исключениями являются id, Class, nil, и Nil, которые , как правило , рассматриваются как ключевые слова языка , даже если они могут также иметь typedefили #defineза ними. Например, компилятор действительно idспециально обрабатывает правила преобразования типа указателя, которые он применяет к объявлениям, а также к решению, создавать ли барьеры записи GC.

Другие исключения in, out, inout, oneway, byref, и bycopy; они используются в качестве аннотаций класса хранения к параметрам метода и типам возвращаемых данных, чтобы сделать распределенные объекты более эффективными. (Они становятся частью сигнатуры метода доступны из среды выполнения, которая DO может посмотреть на то, чтобы определить , как наилучшим сериализации транзакций.) Есть также атрибуты в @propertyдекларациях copy, retain, assign, readonly, readwrite, nonatomic, getter, и setter; они действительны только в разделе атрибутов @propertyобъявления.

Крис Хэнсон
источник
4
Не могли бы вы объяснить что-нибудь о том, что делает @ (выражение)? Это единственный элемент, который я не понимаю во всплывающем окне, когда я набираю @ в xcode.
jchnxu
12
@ (99) совпадает с [NSNumber numberWithInteger: 99]. @ (YES) совпадает с [NSNumber numberWithBool: YES]. Знак @ - это ярлык для создания объектов.
JoJo
10
Кого-нибудь еще смущает тот факт, что этот «ответ» на самом деле не отвечает на поставленный вопрос? Спрашивающий спрашивает: "Что означает '@' в Objective-C?" и отвечающий говорит: «Это означает, что вы используете Objective-C». Я думаю, он уже знал это ...
Джон МакКланг
1
Вроде произвольно; он должен был быть в базовом наборе ASCII и еще не использоваться C, когда писался первый препроцессор Objective-C. Вот почему это @.
Крис Хэнсон
1
Джон МакКланг: Лео прав, нет «более глубокого смысла». Символ @C не использовался, поэтому это был удобный «выход» для альтернативного синтаксического анализа, который также сохранял 100% совместимость с существующим кодом C.
Крис Хэнсон
63

Из учебника Objective-C: символ @ , причина, по которой он стоит перед различными ключевыми словами:

Использование @ должно упростить привязку компилятора Objective-C к существующему компилятору C. Поскольку @ недействителен ни в каком контексте в C, кроме строкового литерала, токенизатор (ранний и простой шаг в компиляторе) можно изменить, чтобы просто искать символ @ вне строковой константы (токенизатор понимает строковые литералы , поэтому он может это различить). Когда встречается @, токенизатор переводит остальную часть компилятора в «режим Objective-C». (Парсер Objective-C будет отвечать за возврат компилятора в обычный режим C, когда он обнаруживает конец кода Objective-C).

Кроме того, если смотреть перед строковым литералом, он создает NSString, а не char * в C.

thelsdj
источник
23

Из Macrumors: Objective-C Tutorial , когда перед строковым литералом:

Есть также литералы @ "" NSString. По сути, это сокращение от метода NSString + stringWithUTF8String.

@ Также добавляет поддержку Unicode в строки C.

Ван Нгуен
источник
13
«По сути, это сокращение от метода NSString + stringWithUTF8String». Не совсем так. Строки выделяются статически, что отличает их от +[NSString stringWithUTF8String:](они выделяются динамически), а освобождение и сохранение не влияют на них.
16

Из руководства :

Фреймворки Objective-C обычно не используют строки в стиле C. Вместо этого они передают строки как объекты NSString.

Класс NSString предоставляет объектную оболочку для строк, обладающую всеми ожидаемыми преимуществами, включая встроенное управление памятью для хранения строк произвольной длины, поддержку Unicode, утилит форматирования в стиле printf и многое другое. Поскольку такие строки используются обычно, Objective-C предоставляет сокращенную нотацию для создания объектов NSString из постоянных значений. Чтобы использовать это сокращение, все, что вам нужно сделать, это поставить перед обычной строкой в ​​двойных кавычках символ @, как показано в следующих примерах:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
паблоэлустондо
источник
3
Но это только один пример того, где @используется. Я смотрю на код так: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... ничего общего с NSString
GreenAsJade