sintassi C non familiari nel contesto Objective-C
-
21-08-2019 - |
Domanda
Vengo a Objective-C da C # senza alcuna conoscenza intermedia della C. (Sì, sì, ho bisogno di imparare il C ad un certo punto e sono fermamente intenzionato a.) In certificato, chiave, e fiducia Servizi Programmazione guida , v'è il seguente codice:
static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";
Ho un NSString
che vorrei utilizzare come un identificatore qui e per la vita di me non riesco a capire come ottenere che in questa struttura dati. La ricerca attraverso Google è stato anche inutile. Ho guardato il rel="nofollow NSString Classe di riferimento e guardò il UTF8String
e getCharacters
metodi, ma non ho potuto ottenere il prodotto nella struttura.
Qual è il semplice, facile trucco mi manca?
Soluzione
Penso che alcune persone mancano il punto qui. Tutti hanno spiegato i due array costanti che vengono impostati per i tag, ma se si desidera utilizzare un NSString
, si può semplicemente aggiungere al dizionario attributo come-è. Non è necessario convertirlo in qualche cosa. Ad esempio:
NSString *publicTag = @"com.apple.sample.publickey";
NSString *privateTag = @"com.apple.sample.privatekey";
Il resto dell'esempio rimane esattamente lo stesso. In questo caso, non è necessario per le stringhe letterali C a tutti.
Altri suggerimenti
Queste sono C stringhe: Array (non NSArrays, ma le matrici C) di caratteri. L'ultimo carattere è una NUL, con il valore numerico 0.
“Uint8” è il nome CoreServices per un ottetto unsigned, che (su Mac OS X) è la stessa di un unsigned char.
static
significa che l'array è specifico per questo file (se è in ambito di file) o persiste attraverso chiamate di funzione (se è all'interno di un corpo di un metodo o funzione).
const
significa proprio quello che ci si indovina:. Non è possibile modificare i caratteri in questi array
\0
è un NUL, ma includendo esplicitamente in un ""
letterale come mostrato in questi esempi è ridondante. Un @
letterale (senza UTF8String
) è NUL-terminated comunque.
C non specifica una codifica. In Mac OS X, è in genere qualcosa di compatibile ASCII-, di solito UTF-8.
Per convertire un NSString ad un C-string, utilizzare cStringUsingEncoding:
o getCString:maxLength:encoding:
. Per avere la NSString estrarre la stringa C in un buffer, utilizzare <=>.
Ottenere un char*
(C stringa) da un NSString non è la parte difficile. (A proposito, mi piacerebbe anche suggerire UTF8String, è molto più semplice.) Il codice da Apple in dotazione funziona perché è l'assegnazione di una stringa C letterale per le static const
variabili array. Assegnazione del risultato di una funzione o di un metodo chiamata a una const
probabilmente non funzionerà.
Recentemente ho risposto un SO domanda su definizione di una costante in Objective-C , che dovrebbe aiutare la vostra situazione. Si può scendere a compromessi per sbarazzarsi del modificatore static
. Se è dichiarato <=>, è almeno sapere che nessuno al di fuori della unità di compilazione dove è dichiarata può fare riferimento, quindi assicuratevi solo di non lasciare un riferimento ad esso "fuga" in modo tale che altro codice potrebbe modificarlo tramite un puntatore , ecc.
Tuttavia, come @ Jason fa notare, non si può nemmeno bisogno di convertirlo in un char * a tutti. Il codice di esempio crea un oggetto NSData per ciascuna di queste stringhe. Si può solo fare qualcosa di simile all'interno del codice (che sostituisce i punti 1 e 3):
NSData* publicTag = [@"com.apple.sample.publickey" dataUsingEncoding:NSUnicodeStringEncoding];
NSData* privateTag = [@"com.apple.sample.privatekey" dataUsingEncoding:NSUnicodeStringEncoding];
Che sembra certo più facile per me che fare con le matrici C, se si dispone già di un NSString.
provare questo
* NSString newString = @ "Questa è una stringa di prova.";
char * TheString;
TheString = [newString cStringWithEncoding: [NSString defaultCStringEncoding]];