Чи потрібно призначати рядок змінній перед порівнянням з іншою?


85

Я хочу порівняти значення an NSStringіз рядком "Неправильно". Ось мій код:

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

Чи справді я повинен створити NSString для "Неправильно"?

Крім того, чи можу я порівняти значення UILabels textз рядком, не присвоюючи рядку значення мітки?


До речі, ви витрачаєте час на initWithFormat, ви можете змінити NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; до NSString * wrongTxt = @ "Неправильно"; Займайтеся з initWithFormat, лише якщо ви намагаєтеся обчислити рядок з інших входів, наприклад, NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "% @ помилився% d разів", craigString, wrongCount];
Крейг

Відповіді:


178

Чи справді я повинен створити NSString для "Неправильно"?

Ні, чому б просто не зробити:

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

Використання @""просто створює рядковий літерал, який є дійсним NSString.

Крім того, чи можу я порівняти значення тексту UILabel.text із рядком, не призначаючи рядку значення мітки?

Так, ви можете зробити щось на зразок:

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

Це працює. Я маю на увазі, що я просто маю код помилки. Раніше це кидало виняток.
Брайан

1
Для деталізації: label.text - це рядок, тому, звичайно, вам не потрібно створювати з нього рядок для порівняння.
Amagrammer


8

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

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

Незважаючи на те, що вищесказане працює, воно забезпечує збережену змінну NSString, яку вам потрібно буде явно звільнити після того, як ви закінчите її використовувати.

Наступного разу, коли вам буде потрібна рядкова змінна, ви зможете використовувати символ "@" набагато зручніше:

NSString *myString = @"SomeText";

Це буде автоматично видано, коли ви закінчите з цим, щоб ви також уникнули витоків пам'яті ...

Сподіваюся, це допоможе!


Мені це було цікаво. Я часто бачу рядкові змінні, які є об'єктивними об'єктами c, але вони ніколи не випускаються. Дякую!
Брайан

2
Підказка знаходиться в біті "alloc". Якщо ви використовуєте Alloc (або копію), вам доведеться спеціально випустити. Якщо ви цього не зробите, домовленість полягає в тому, що для об’єкта вже встановлено автоматичний випуск.
h4xxr

Так, хоча він може містити newабо, copyнаприклад, newObject(від NSDictionaryController) або mutableCopy(від NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Алекс Розанський

2

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

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.