2012-04-19 4 views
9

ich die Objektvariable als NSString erklären Aber wenn ich die XCode verwenden, um in mein Objekt zu suchen, sah ich dort zwei Arten von String sind, scheint es, dass das System automatisch auf einen anderen:Was ist der Unterschied zwischen NSCFString und NSConstantString?

enter image description here

Was sind die Unterschiede zwischen ihnen? Sind sie füreinander und für andere austauschbar? Auch, was ist die Bedingung, dass zwei zu einem anderen wechseln?

Danke.

+0

Ich beobachtete __NSCFConstantString im Xcode-Debugger für UILabel-Variable, wenn ich NSString * UILabel * versehentlich zugewiesen – sergtk

Antwort

12

Sie sind beide konkrete Unterklassen von NSString. __NSCFString wird während der Laufzeit über Foundation oder Core Foundation erstellt, während __NSCFConstantString entweder eine CFSTR("...") Konstante oder eine @"..." Konstante ist, die zur Kompilierungszeit erstellt wird.

Ihre Schnittstellen sind privat. Behandle sie beide als NSString und du solltest keine Probleme haben.

+8

Sie werden Probleme haben, wenn Sie versuchen, die beiden Objekte mit IsKindOfClass zu vergleichen: Es funktioniert nur, wenn der __NSCFConstantString der Empfänger ist. Nur ein Kopf für jeden, der eine der Feinheiten kennen möchte, die das beinhaltet. – fjlksahfob

+0

'-isKindOfClass:' wird nicht für den Objektvergleich verwendet, daher bin ich mir nicht sicher, was genau Sie hier erreichen. –

+2

gut, ich habe es für das verwendet, also half es –

2

Soweit ich weiß, NSCFConstantString ist eine Implementierung von NSString, die die Zeichenfolge Daten im Code-Speicher hält. Compiler erstellt Instanzen davon, wenn Sie @"string" Konstanten verwenden. Sie können NSCFConstantString verwenden, wo auch immer eine NSString wegen der Unterklasse/Oberklasse-Beziehung verwendet werden könnte, aber offensichtlich nicht umgekehrt.

3

Es scheint eine vom Compiler vorgenommene Optimierung zu sein. Ich vermute, dass die Zeichenfolge, die in eine NSCFConstantString konvertiert wird, gleich einer der Konstanten ist, die aus Leistungsgründen zwischengespeichert wird. Ihr NSCFString ist nur eine gebührenfreie gebrückte Zeichenfolge, die eine NSString oder eine CFString sein kann. Weitere Informationen finden Sie unter this article.

0

Ein Vorteil von NSString zu NSCFConstantString Umwandlung wird als nächstes Beispiel:

Zum Beispiel - in Verfahren cellForRowAtIndexPath für Tableview, wenn Sie

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

schreiben werden, als es die gleiche Adresse für jede Zelle sein würde. Aber mit NSLog (@ "% p", & Ident) wäre es eine andere Adresse für jede Zelle.

NSString ident = @ „Identifikator“ ist ein Sonderfall - als eine __NSCFConstantString Klasse, so dass alle gleich Stringliterale Speicher die Adresse gleichen Speicher erstellt wird Nutzung optimieren teilen werden. & ident wird eine Adresse einer lokalen Variablen erhalten, die auf einen NSString verweist und NSString ** type haben wird.

Reference zu Quelle (Kommentare).

Verwandte Themen