O que o símbolo @ representa no objetivo-c?

141

Estou aprendendo o objetivo-c e continuo esbarrando no símbolo @. É usado em diferentes cenários, por exemplo, no início de uma sequência ou para sintetizar métodos de acessador.

O que o símbolo @ significa no objetivo-c?

Benedict Cohen
fonte
Por que @ é usado antes de @interface e @end?
Lalit Kumar

Respostas:

159

O @caractere não é usado nos identificadores C ou C ++, por isso é usado para introduzir palavras-chave da linguagem Objective-C de uma maneira que não entre em conflito com as palavras-chave das outras línguas. Isso permite que a parte "Objetiva" da linguagem se misture livremente com a parte C ou C ++.

Portanto, com muito poucas exceções, sempre que você vê @em algum código Objective-C, você está olhando para construções de Objective-C em vez de construções de C ou C ++.

As principais exceções são id, Class, nil, e Nil, que geralmente são tratadas como palavras-chave de linguagem, embora eles também podem ter um typedefou #defineatrás deles. Por exemplo, o compilador realmente trata idespecialmente em termos das regras de conversão de tipo de ponteiro que se aplica às declarações, bem como à decisão de gerar ou não barreiras de gravação no GC.

Outras exceções são in, out, inout, oneway, byref, e bycopy; elas são usadas como anotações de classe de armazenamento no parâmetro do método e nos tipos de retorno para tornar os Objetos Distribuídos mais eficientes. (Eles se tornam parte da assinatura do método disponível a partir do tempo de execução, que não pode olhar para determinar a melhor forma de serialize uma transação.) Há também os atributos dentro @propertydeclarações, copy, retain, assign, readonly, readwrite, nonatomic, getter, e setter; esses são válidos somente na seção de atributos de uma @propertydeclaração.

Chris Hanson
fonte
4
Você pode explicar algo sobre o que @ (expressão) faz? É o único item que não entendo no pop-up mostrado quando digito @ no xcode.
jchnxu
10
@ (99) é igual a [NSNumber numberWithInteger: 99]. @ (SIM) é o mesmo que [NSNumber numberWithBool: YES]. O sinal @ é um atalho para criar objetos.
JoJo
7
Alguém mais está confuso com o fato de que essa "resposta" não responde realmente à pergunta declarada? O solicitante diz "o que '@' significa no Objective-C?" e o respondente diz "significa que você está usando o Objective-C". Eu acho que ele já sabia tanto ...
Jon McClung
1
Tipo de arbitrário; precisava estar no conjunto ASCII base e ainda não ser usado por C quando o primeiro pré-processador Objective-C estava sendo gravado. É por isso que é @.
21319 Chris Hanson
1
Jon McClung: Leo está correto, não há um "significado mais profundo". O @caractere não foi utilizado por C, portanto, era uma "escotilha de escape" conveniente para a análise alternativa que também preservava 100% de compatibilidade com o código C existente.
21319 Chris Hanson
63

No Tutorial do Objective-C: o símbolo @ , a razão pela qual está na frente de várias palavras-chave:

O uso de @ deve facilitar a instalação de um compilador Objective-C em um compilador C existente. Como @ não é válido em nenhum contexto em C, exceto em uma literal de cadeia, o tokenizer (uma etapa inicial e simples do compilador) pode ser modificado para procurar simplesmente o caractere @ fora de uma constante de cadeia (o tokenizador entende os literais de cadeia , portanto, é possível distinguir isso). Quando @ é encontrado, o tokenizer coloca o restante do compilador no "modo Objective-C". (O analisador Objective-C seria responsável por retornar o compilador de volta ao modo C normal quando detectar o final do código Objective-C).

Além disso, quando visto na frente de uma string literal, ele cria um NSString em vez de um 'char *' em C.

thelsdj
fonte
24

No Macrumors: Tutorial do Objective-C , quando na frente da string literal:

Também existem @ "" literais NSString. É essencialmente uma abreviação para o método + stringWithUTF8String do NSString.

O @ também adiciona suporte unicode às seqüências C.

Van Nguyen
fonte
12
"É essencialmente uma abreviação para o método + stringWithUTF8String do NSString." Bem, não exatamente. As cadeias são alocadas estaticamente, o que as diferencia de +[NSString stringWithUTF8String:](aquelas são alocadas dinamicamente), e liberar e reter não têm efeito sobre elas.
16

Do manual :

As estruturas de Objective-C normalmente não usam seqüências de caracteres de estilo C. Em vez disso, eles passam seqüências de caracteres como objetos NSString.

A classe NSString fornece um invólucro de objeto para seqüências de caracteres com todas as vantagens que você esperaria, incluindo gerenciamento de memória interno para armazenar seqüências de comprimento arbitrário, suporte para Unicode, utilitários de formatação no estilo printf e muito mais. Como essas cadeias de caracteres são usadas normalmente, o Objective-C fornece uma notação abreviada para criar objetos NSString a partir de valores constantes. Para usar essa abreviação, tudo o que você precisa fazer é preceder uma seqüência normal de aspas duplas com o símbolo @, conforme mostrado nos exemplos a seguir:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
pabloelustondo
fonte
3
Mas este é apenas um exemplo de onde @é usado. Eu estou olhando para um código como este: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... nada a ver com NSString
GreenAsJade