Обязательно ли присваивать строку переменной перед ее сравнением с другой?

85

Я хочу сравнить значение NSStringстроки со строкой «Неправильно». Вот мой код:

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

Мне действительно нужно создавать NSString для "Wrong"?

Кроме того, могу ли я сравнить значение a UILabelсо textстрокой без присвоения значения метки строке?

Брайан
источник
Кстати, вы тратите время на initWithFormat, вы можете изменить NSString * errorTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; в NSString * errorTxt = @ "Неправильно"; Используйте initWithFormat только в том случае, если вы собираетесь попытаться вычислить строку из других входных данных, например, NSString * errorTxt = [[NSString alloc] initWithFormat: @ "% @ ошибся% d раз", craigString ,rongCount];
Craig

Ответы:

178

Мне действительно нужно создавать NSString для "Wrong"?

Нет, почему бы просто не сделать:

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

Использование @""просто создает строковый литерал, который является допустимым NSString.

Кроме того, могу ли я сравнить значение UILabel.text со строкой без присвоения значения метки строке?

Да, вы можете сделать что-то вроде:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}
Алекс Розанский
источник
Это работает. Думаю, у меня просто код с ошибками. Раньше он генерировал исключение.
Брайан
1
Чтобы уточнить: label.text ЯВЛЯЕТСЯ строкой, поэтому, конечно, вам не нужно создавать из нее строку для сравнения.
Amagrammer
26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}
Wevah
источник
Спасибо, wevah. Perspx был на 1 секунду быстрее.
Брайан
8

Брайан, тоже стоит добавить сюда - остальные, конечно, правы, что вам не нужно объявлять строковую переменную. Однако в следующий раз, когда вы захотите объявить строку, вам не нужно делать следующее:

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

Хотя приведенное выше работает, он предоставляет сохраненную переменную NSString, которую вам нужно будет явно освободить после того, как вы закончите ее использовать.

В следующий раз, когда вам понадобится строковая переменная, вы можете использовать символ «@» гораздо более удобным способом:

NSString *myString = @"SomeText";

Он будет автоматически выпущен, когда вы закончите с ним, поэтому вы также избежите утечек памяти ...

Надеюсь, это поможет!

h4xxr
источник
Мне было интересно об этом. Я часто вижу строковые переменные, которые являются объектами объекта c, но они никогда не освобождаются. Благодарность!
Брайан
2
Подсказка находится в бите "alloc". Если вы используете Alloc (или Copy), вам нужно специально выпустить. Если вы этого не сделаете, то по соглашению для объекта уже будет установлен автоматический выпуск.
h4xxr
Да, хотя он может содержать newили, copyнапример, newObject(из NSDictionaryController) или mutableCopy(из NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski
2

Вы также можете использовать методы класса NSString, которые также создадут автоматически выпущенный экземпляр и будут иметь дополнительные параметры, такие как форматирование строки:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
оборота дэниэлпунт
источник