2009-07-31 7 views
0

Ich bin wirklich verwirrt mit NSStrings. Wie damals, als sollte ichiPhone Dev - NSString Erstellung

NSString *aString = @"Hello"; 

der sollte es tun:

NSString *aString = [[NSString alloc] initWithString:@"Hello"]; 

Aber dann seine verschiedenen, wenn Sie einen Wert in eine NSString Eigenschaft sind zuweisen, nicht wahr? Kann jemand das für mich klären?

Danke !!

Antwort

2

Im Allgemeinen sollten Sie das erste tun, aber sie sind meist funktional gleich. Sie können konstante NSStrings wie normale NSString String-Objekte, zum Beispiel behandeln:

[@"Hello" length] 

wird 5. zurückkehren Sie können sie auf Eigenschaften zuweisen, alles funktioniert einfach. Die eine Sache, die Sie bemerken könnten, ist, dass Sie sich mit den konstanten NSStrings keine Gedanken über Retain/Release machen müssen. Dies liegt daran, dass sie tatsächlich in den schreibgeschützten Datenbereich der Anwendungen übertragen werden und keinen zugewiesenen Speicher haben. Anrufe behalten und freigeben gegen sie funktionieren immer noch, sie werden nur Noops.

+0

Ok, aber ich wollte es formatieren Ich muss initWithFormat zuweisen (oder die Autorelease-Methode StringWithFormat) richtig? – mk12

+1

Ja, weil eine Zeichenfolge, die Sie über ein Format generieren, nicht konstant ist, wird sie zur Laufzeit dynamisch erstellt. –

0
NSString *aString = @"Hello"; 

Wird eine autoreleased Zeichenfolge erstellen. Das heißt, wenn Sie nicht explizit retain es, wird es möglicherweise verschwinden, nachdem Ihre Methode vorbei ist (und manchmal ist das völlig in Ordnung). Aber wenn Sie nach dieser Zeit daran festhalten wollen, müssen Sie es behalten.

Wenn Sie erstellen eine Eigenschaft für diese Zeichenfolge wie diese

@property (retain) NSString *aString; 

Und dann wie folgt vergeben:

self.aString = @"Hello"; 

Dann sind Sie richtig die Zeichenfolge beibehalten und es wird bleiben, um.

Auf der anderen Seite erstellt alloc, init eine Zeichenfolge für Sie mit einer Retain-Anzahl von 1, und wenn Sie es nicht über diese Methode benötigen, sollten Sie release es.

**** Bearbeiten: @ "Hallo" ist keine Autorelease-String, wie andere hingewiesen haben. Mein Fehler. ****

+0

Dies ist falsch. Sie müssen keinen konstanten NSString beibehalten. Es wird nicht automatisch freigegeben erstellt, es ist eine spezielle Unterklasse des NSString-Klassenclusters, die keinen Speicher reserviert, da es einer schreibgeschützten Seite des Programms zugeordnet ist. –

+0

Hast du meine Bearbeitung nicht gesehen? – jbrennan