É necessário atribuir uma string a uma variável antes de compará-la a outra?

85

Quero comparar o valor de NSStringa à string "Errado". Aqui está o meu código:

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

Eu realmente preciso criar um NSString para "Wrong"?

Além disso, posso comparar o valor de um UILabel's textpara uma cadeia sem atribuir o valor do rótulo para uma string?

Bryan
fonte
A propósito, você está perdendo tempo com initWithFormat, você pode alterar NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; para NSString * wrongTxt = @ "Wrong"; Apenas se preocupe com initWithFormat se você for tentar calcular uma string a partir de outras entradas, por exemplo, NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "% @ estava errado% d vezes", craigString, wrongCount];
Craig

Respostas:

178

Eu realmente preciso criar um NSString para "Wrong"?

Não, por que não fazer apenas:

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

Usar @""simplesmente cria um literal de string, que é válido NSString.

Além disso, posso comparar o valor de um UILabel.text a uma string sem atribuir o valor do rótulo a uma string?

Sim, você pode fazer algo como:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}
Alex Rozanski
fonte
Isso funciona. Acho que só tenho um código com erros. Ele estava lançando uma exceção antes.
Bryan
1
Para elaborar: label.text É uma string, então é claro que você não precisa criar uma string a partir dele para a comparação.
Amagrammer de
26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}
Wevah
fonte
Obrigado wevah. O Perspx foi 1 segundo mais rápido.
Bryan
8

Brian, também vale a pena acrescentar aqui - os outros estão, é claro, corretos ao dizer que você não precisa declarar uma variável de string. No entanto, da próxima vez que você quiser declarar uma string, não precisará fazer o seguinte:

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

Embora o procedimento acima funcione, ele fornece uma variável NSString retida que você precisará liberar explicitamente após terminar de usá-la.

Da próxima vez que você quiser uma variável de string, pode usar o símbolo "@" de uma maneira muito mais conveniente:

NSString *myString = @"SomeText";

Isso será liberado automaticamente quando você terminar, para evitar vazamentos de memória também ...

Espero que ajude!

h4xxr
fonte
Eu estava me perguntando sobre isso. Costumo ver variáveis ​​de string que são objetos c objetivos, mas nunca são liberadas. Obrigado!
Bryan de
2
A dica está no bit "alloc". Se você usar um Alloc (ou Copiar), deverá liberar especificamente. Do contrário, a convenção é que o objeto já estará definido para liberação automática.
h4xxr
Sim, embora possa conter newou, copypor exemplo newObject(de NSDictionaryController) ou mutableCopy(de NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski
2

Você também pode usar os métodos da classe NSString, que também criarão uma instância autoreleased e têm mais opções como formatação de string:

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