2012-04-19 8 views
9

dichiaro la variabile oggetto come NSString Ma quando uso il XCode di esaminare il mio oggetto, ho visto ci sono due tipi di stringa, sembra che il sistema di trasferimento automatico ad un altro:Qual è la differenza tra NSCFString e NSConstantString?

enter image description here

Quali sono le differenze tra loro? Sono intercambiabili con l'uno e con gli altri. Inoltre, qual è la condizione che due cambiano in un'altra?

Grazie.

+0

Ho osservato __NSCFConstantString nel debugger Xcode per la variabile UILabel quando ho assegnato NSString * a UILabel * per caso – sergtk

risposta

12

Sono entrambe sottoclassi concrete di NSString. __NSCFString è stato creato durante il runtime tramite Foundation o Core Foundation, mentre __NSCFConstantString è una costanteo una costante @"...", creata in fase di compilazione.

Le loro interfacce sono private. Trattali entrambi come NSString e non dovresti avere problemi.

+8

Avrete problemi se provate a confrontare i due oggetti con isKindOfClass: funzionerà solo se il __NSCFConstantString è il ricevitore. Solo un testa a testa a chiunque voglia conoscere una delle sottigliezze che questo implica. – fjlksahfob

+0

'-isKindOfClass:' non è usato per il confronto tra oggetti, quindi non sono sicuro di quello che stai ottenendo qui. –

+2

beh l'ho usato per quello quindi mi ha aiutato –

2

Per quanto ne so, NSCFConstantString è un'implementazione di NSString che mantiene i dati di stringa nella memoria di codice. Il compilatore crea istanze di esso quando si utilizzano le costanti @"string". È possibile utilizzare NSCFConstantString ovunque sia possibile utilizzare uno NSString a causa della relazione sottoclasse/superclasse, ma ovviamente non il contrario.

3

Sembra essere un'ottimizzazione eseguita dal compilatore. Sto indovinando che la stringa che si sta convertendo in un NSCFConstantString è uguale a una delle costanti che viene memorizzata nella cache per motivi di prestazioni. Il tuo NSCFString è solo una stringa con ponticelli gratuita che può essere un NSString o un CFString. Vedere this article per ulteriori informazioni.

0

Uno dei vantaggi di trasformare NSString a NSCFConstantString è prossimo esempio:

Per esempio - nel metodo cellForRowAtIndexPath per tableView se si scrive

NSString *ident = @"identificator"; 
NSLog(@"%p", ident); 

di quello che sarebbe lo stesso indirizzo per ogni cellula. Ma con NSLog (@ "% p", & ident) sarebbe un indirizzo diverso per ogni cella.

NSString ident = @ "identificatore" è un caso particolare - viene creato come una classe __NSCFConstantString in modo che tutti i letterali stringa pari condivideranno lo stesso indirizzo di memoria per ottimizzare l'utilizzo della memoria. & ident otterrà un indirizzo di una variabile locale che punta a una NSString e avrà il tipo di NSString ** **.

Reference alla fonte (commenti).

Problemi correlati