Cosa rappresenta il simbolo @ in obiettivo-c?


141

Sto imparando obiettivo-c e continuo a sbattere contro il simbolo @. Viene utilizzato in diversi scenari, ad esempio all'inizio di una stringa o per sintetizzare metodi di accesso.

Cosa significa il simbolo @ in obiettivo-c?


perché @ viene utilizzato prima di @interface e @end?
Lalit Kumar,

Risposte:


159

Il @carattere non viene utilizzato negli identificatori C o C ++, quindi viene utilizzato per introdurre parole chiave nel linguaggio Objective-C in un modo che non sia in conflitto con le parole chiave degli altri linguaggi. Ciò consente alla parte "Obiettivo" del linguaggio di mescolarsi liberamente con la parte C o C ++.

Quindi, con pochissime eccezioni, ogni volta che vedi @un codice Objective-C, stai osservando i costrutti Objective-C anziché i costrutti C o C ++.

Le principali eccezioni sono id, Class, nil, e Nil, che sono generalmente trattati come parole chiave del linguaggio, anche se può anche avere una typedefo #definedietro di loro. Ad esempio, il compilatore in realtà tratta idspecialmente in termini di regole di conversione del tipo di puntatore che si applica alle dichiarazioni, nonché alla decisione se generare barriere di scrittura GC.

Altre eccezioni sono in, out, inout, oneway, byref, e bycopy; questi vengono utilizzati come annotazioni della classe di archiviazione sul parametro del metodo e sui tipi restituiti per rendere più efficienti gli oggetti distribuiti. (Diventano parte della firma del metodo disponibile dal runtime, che DO può esaminare per determinare come serializzare al meglio una transazione.) Ci sono anche gli attributi all'interno delle @propertydichiarazioni,copy , retain, assign, readonly, readwrite, nonatomic, getter, e setter; quelli sono validi solo nella sezione degli attributi di una @propertydichiarazione.


4
Puoi spiegare qualcosa su cosa fa @ (espressione)? È l'unico elemento che non capisco nel popup mostrato quando digito @ in xcode.
jchnxu,

10
@ (99) è uguale a [NSNumber numberWithInteger: 99]. @ (YES) è uguale a [NSNumber numberWithBool: YES]. Il segno @ è una scorciatoia per la creazione di oggetti.
JoJo,

7
Qualcun altro è confuso dal fatto che questa "risposta" in realtà non risponde alla domanda dichiarata? Il richiedente dice "cosa significa '@' in Objective-C?" e il risponditore dice "Significa che stai usando Objective-C." Penso che lo sapesse già ...
Jon McClung il

1
Sorta di arbitrario; doveva essere nel set ASCII di base e non già usato da C quando il primo preprocessore Objective-C veniva scritto. Ecco perché lo è @.
Chris Hanson,

1
Jon McClung: Leo ha ragione, non esiste un "significato più profondo". Il @personaggio non era utilizzato da C, quindi era un comodo "tratteggio di fuga" per l'analisi alternativa che conservava anche la compatibilità al 100% con il codice C esistente.
Chris Hanson,

63

Dal tutorial di Objective-C: il simbolo @ , il motivo per cui si trova sulla parte anteriore di varie parole chiave:

L'uso di @ dovrebbe rendere più semplice il bolt di un compilatore Objective-C su un compilatore C. Poiché @ non è valido in nessun contesto in C tranne un letterale di stringa, il tokenizer (un passaggio iniziale e semplice nel compilatore) può essere modificato per cercare semplicemente il carattere @ al di fuori di una costante di stringa (il tokenizer comprende letterali di stringa , quindi è in grado di distinguerlo). Quando viene rilevato @, il tokenizer mette il resto del compilatore in "modalità Objective-C". (Il parser Objective-C sarebbe responsabile per riportare il compilatore in modalità C normale quando rileva la fine del codice Objective-C).

Inoltre, se visto di fronte a una stringa letterale, rende una NSString piuttosto che un "carattere *" in C.


24

Da Macrumors: Objective-C Tutorial , quando di fronte a string letterale:

Ci sono anche @ "" letterali NSString. È essenzialmente una scorciatoia per il metodo + stringWithUTF8String di NSString.

@ Aggiunge anche il supporto unicode alle stringhe C.


12
"È essenzialmente una scorciatoia per il metodo + stringWithUTF8String di NSString." Bene, non esattamente. Le stringhe sono allocate staticamente, il che le rende diverse da +[NSString stringWithUTF8String:](quelle allocate dinamicamente) e il rilascio e il mantenimento non hanno alcun effetto su di esse.

16

Dal manuale :

I framework Objective-C in genere non usano stringhe in stile C. Al contrario, passano le stringhe come oggetti NSString.

La classe NSString fornisce un wrapper di oggetti per stringhe che presenta tutti i vantaggi che ci si aspetterebbe, tra cui la gestione della memoria integrata per l'archiviazione di stringhe di lunghezza arbitraria, il supporto per Unicode, utilità di formattazione in stile printf e altro ancora. Poiché tali stringhe sono comunemente utilizzate, Objective-C fornisce una notazione abbreviata per la creazione di oggetti NSString da valori costanti. Per usare questa scorciatoia, tutto ciò che devi fare è precedere una normale stringa tra virgolette doppie con il simbolo @, come mostrato nei seguenti esempi:

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

3
Ma questo è solo un esempio di dove @viene utilizzato. Sto guardando un codice come questo: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... niente a che fare con NSString
GreenAsJade
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.