Что означает символ @ в объекте-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.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.