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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Также, если перед строковым литералом видно, что он делает NSString, а не "char *" в C.

Ответ 3

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

Существуют также литералы NSString @"". Это, по существу, сокращение для метода NSString + stringWithUTF8String.

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

Ответ 4

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

Структуры

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

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

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];