É 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?


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 
}

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
}

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!


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];
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.