Що символізує @ у символі-c?


141

Я вивчаю aim-c і продовжую натикатися на символ @. Він використовується в різних сценаріях, наприклад, на початку рядка або для синтезу методів аксесуарів.

Що означає символ @ у об’єкті-c?


чому @ використовується перед @interface та @end?
Лаліт Кумар

Відповіді:


159

@Знак не використовується в ідентифікаторах З або С ++, тому вона використовується для введення ключових слів мови 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

10
@ (99) те саме, що [NSNumber numberWithInteger: 99]. @ (ТАК) те саме, що [NSNumber numberWithBool: YES]. Знак @ - це ярлик для створення об'єктів.
JoJo

7
Хтось ще плутає той факт, що ця "відповідь" насправді не відповідає на поставлене запитання? Автор запитує: "Що означає" @ "в" Objective-C "?" і відповідач каже: "Це означає, що ви використовуєте" Objective-C ". Я думаю, він уже знав стільки ж…
Джон МакКлунг

1
Сорт довільний; він повинен був знаходитися в базовому наборі ASCII і не використовуватися C під час написання першого препроцесора Objective-C. Ось чому це @.
Кріс Гансон

1
Джон МакКлунг: Лео правильно, немає "глибшого сенсу". @Персонаж був невикористаними C, так що це було зручно «аварійний люк» для альтернативної інтерпретації , які також збереглися 100% сумісність з існуючим кодом C.
Кріс Гансон

63

З Підручника Objective-C: Символ @ , причина якого знаходиться на передній частині різних ключових слів:

Використання @ повинно полегшити приєднання компілятора Objective-C до існуючого компілятора C. Оскільки @ недійсний у будь-якому контексті C, крім рядкового літералу, токенізатор (ранній і простий крок у компіляторі) може бути змінений, щоб просто шукати символ @ поза строковою константою (токенізатор розуміє рядкові літерали , тому це в змозі це відрізнити). Якщо @ зустрінеться, токенізатор переведе решту компілятора в режим "Об'єктив-С". (Аналізатор Objective-C несе відповідальність за повернення компілятора в звичайний режим C, коли він виявить кінець коду Objective-C).

Також, якщо його побачити перед літеральним рядком, він робить NSString, а не 'char *' у C.


24

З Macrumors: Підручник Objective-C , коли перед літеральним рядком:

Є також "" "NSString літерали. Це по суті скорочення для методу + stringWithUTF8String NSString.

@ Також додає підтримку unicode до рядків C.


12
"Це по суті скорочення для методу 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),
дивлюсь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.