È necessario assegnare una stringa a una variabile prima di confrontarla con un'altra?


85

Voglio confrontare il valore di an NSStringcon la stringa "Wrong". Ecco il mio codice:

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

Devo davvero creare un NSString per "Wrong"?

Inoltre, posso confrontare il valore di un UILabel's textin una stringa senza assegnare il valore dell'etichetta in una stringa?


A proposito, stai perdendo tempo con initWithFormat, puoi cambiare NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; a NSString * wrongTxt = @ "Wrong"; Pensa solo a initWithFormat se vuoi provare a calcolare una stringa da altri input, ad es. NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "% @ was wrong% d times", craigString, wrongCount];
Craig

Risposte:


178

Devo davvero creare un NSString per "Wrong"?

No, perché non farlo semplicemente:

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

L'uso @""crea semplicemente una stringa letterale, che è un valore valido NSString.

Inoltre, posso confrontare il valore di un UILabel.text con una stringa senza assegnare il valore dell'etichetta a una stringa?

Sì, puoi fare qualcosa come:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}

Che funzioni. Immagino di avere solo un codice difettoso. Stava gettando un'eccezione prima.
Bryan

1
Per elaborare: label.text È una stringa, quindi ovviamente non è necessario creare una stringa da essa per il confronto.
Amagrammer

26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}

Grazie wevah. Perspx era 1 secondo più veloce.
Bryan

8

Brian, vale anche la pena menzionarlo qui - gli altri hanno ovviamente ragione sul fatto che non è necessario dichiarare una variabile stringa. Tuttavia, la prossima volta che vuoi dichiarare una stringa non devi fare quanto segue:

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

Sebbene quanto sopra funzioni, fornisce una variabile NSString mantenuta che sarà quindi necessario rilasciare esplicitamente dopo aver finito di usarla.

La prossima volta che vuoi una variabile stringa puoi usare il simbolo "@" in un modo molto più conveniente:

NSString *myString = @"SomeText";

Questo verrà rilasciato automaticamente quando avrai finito, così eviterai anche perdite di memoria ...

Spero che aiuti!


Me lo stavo chiedendo. Vedo spesso variabili stringa che sono oggetti c oggettivi, ma non vengono mai rilasciati. Grazie!
Bryan

2
Il suggerimento è nel bit "alloc". Se utilizzi un Alloc (o una copia), devi rilasciare specificamente. Se non lo fai, la convenzione è che l'oggetto sarà già impostato per il rilascio automatico.
h4xxr

Sì, anche se può contenere newo copyper esempio newObject(da NSDictionaryController) o mutableCopy(da NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski

2

Puoi anche utilizzare i metodi della classe NSString che creeranno anche un'istanza rilasciata automaticamente e avranno più opzioni come la formattazione della stringa:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.