Muss einer Variablen eine Zeichenfolge zugewiesen werden, bevor sie mit einer anderen verglichen wird?

85

Ich möchte den Wert von a NSStringmit der Zeichenfolge "Wrong" vergleichen. Hier ist mein Code:

NSString *wrongTxt = [[NSString alloc] initWithFormat:@"Wrong"];
if( [statusString isEqualToString:wrongTxt] ){
     doSomething;
}

Muss ich wirklich einen NSString für "Wrong" erstellen?

Außerdem kann ich vergleichen Sie den Wert eines UILabel‚s textin einen String ohne das Etikett Wert in einen String zuweisen?

Bryan
quelle
Übrigens, Sie verschwenden Zeit mit initWithFormat. Sie können NSString ändern. * FalseTxt = [[NSString-Zuweisung] initWithFormat: @ "Wrong"]; zu NSString * falseTxt = @ "Wrong"; Stören Sie sich nur an initWithFormat, wenn Sie versuchen, eine Zeichenfolge aus anderen Eingaben zu berechnen, z. B. NSString * falseTxt = [[NSString-Zuweisung] initWithFormat: @ "% @ war% d mal falsch", craigString, falseCount];
Craig

Antworten:

178

Muss ich wirklich einen NSString für "Wrong" erstellen?

Nein, warum nicht einfach:

if([statusString isEqualToString:@"Wrong"]){
    //doSomething;
}

Mit using wird @""einfach ein String-Literal erstellt, das gültig ist NSString.

Kann ich auch den Wert einer UILabel.text mit einer Zeichenfolge vergleichen, ohne den Zeichenfolgenwert einer Zeichenfolge zuzuweisen?

Ja, Sie können so etwas tun:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}
Alex Rozanski
quelle
Das funktioniert. Ich glaube, ich habe nur Buggy-Code. Es wurde zuvor eine Ausnahme ausgelöst.
Bryan
1
Um es näher zu erläutern: label.text IST eine Zeichenfolge, daher müssen Sie für den Vergleich natürlich keine Zeichenfolge daraus erstellen.
Amagrammer
26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}
Wevah
quelle
Danke Wevah. Perspx war 1 Sekunde schneller.
Bryan
8

Brian, es lohnt sich auch, hier reinzuwerfen - die anderen haben natürlich Recht, dass Sie keine String-Variable deklarieren müssen. Wenn Sie das nächste Mal eine Zeichenfolge deklarieren möchten, müssen Sie jedoch nicht Folgendes tun:

NSString *myString = [[NSString alloc] initWithFormat:@"SomeText"];

Obwohl das oben Genannte funktioniert, bietet es eine beibehaltene NSString-Variable, die Sie nach Beendigung der Verwendung explizit freigeben müssen.

Wenn Sie das nächste Mal eine Zeichenfolgenvariable möchten, können Sie das Symbol "@" viel bequemer verwenden:

NSString *myString = @"SomeText";

Dies wird automatisch freigegeben, wenn Sie damit fertig sind, damit Sie auch Speicherlecks vermeiden ...

Hoffentlich hilft das!

h4xxr
quelle
Ich habe mich darüber gewundert. Ich sehe oft String-Variablen, die objektive c-Objekte sind, aber nie freigegeben werden. Vielen Dank!
Bryan
2
Der Hinweis befindet sich im Bit "Zuweisen". Wenn Sie eine Zuordnung (oder Kopie) verwenden, müssen Sie diese speziell freigeben. Wenn Sie dies nicht tun, wird das Objekt bereits auf Autorelease eingestellt.
h4xxr
Ja, obwohl es enthalten kann newoder copyzum Beispiel newObject(von NSDictionaryController) oder mutableCopy(von NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski
2

Sie können auch die NSString-Klassenmethoden verwenden, mit denen auch eine automatisch freigegebene Instanz erstellt wird und weitere Optionen wie die Formatierung von Zeichenfolgen verfügbar sind:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
Danielpunt
quelle