Czy konieczne jest przypisanie ciągu do zmiennej przed porównaniem jej z inną?

85

Chcę porównać wartość an NSStringz ciągiem „Wrong”. Oto mój kod:

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

Czy naprawdę muszę utworzyć NSString dla „Wrong”?

Czy mogę również porównać wartość UILabela textdo łańcucha bez przypisywania wartości etykiety do ciągu?

Bryan
źródło
Swoją drogą, marnujesz czas na initWithFormat, możesz zmienić NSString * wrongTxt = [[NSString assign] initWithFormat: @ "Wrong"]; do NSString * evilTxt = @ "Wrong"; Zawracaj sobie głowę initWithFormat tylko wtedy, gdy masz zamiar obliczyć ciąg z innych danych wejściowych, np. NSString * failedTxt = [[NSStringocation] initWithFormat: @ "% @ było błędne% d razy", craigString, błędneCount];
Craig,

Odpowiedzi:

178

Czy naprawdę muszę utworzyć NSString dla „Wrong”?

Nie, czemu po prostu nie zrobić:

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

Użycie @""po prostu tworzy literał ciągu, który jest prawidłowy NSString.

Czy mogę również porównać wartość UILabel.text do ciągu znaków bez przypisywania wartości etykiety do ciągu?

Tak, możesz zrobić coś takiego:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}
Alex Różański
źródło
To działa. Chyba po prostu mam błędny kod. Wcześniej rzucał wyjątek.
Bryan,
1
Aby rozwinąć: label.text JEST napisem, więc oczywiście nie musisz tworzyć z niego łańcucha do porównania.
Amagrammer
26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}
Wevah
źródło
Dzięki wevah. Perspx był o 1 sekundę szybszy.
Bryan,
8

Brian, również warto tu wrzucić - inni oczywiście mają rację, że nie musisz deklarować zmiennej typu string. Jednak następnym razem, gdy będziesz chciał zadeklarować ciąg, nie musisz wykonywać następujących czynności:

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

Chociaż powyższe działa, zapewnia zachowaną zmienną NSString, którą będziesz musiał jawnie zwolnić po zakończeniu jej używania.

Następnym razem, gdy będziesz potrzebować zmiennej łańcuchowej, możesz użyć symbolu „@” w znacznie wygodniejszy sposób:

NSString *myString = @"SomeText";

Zostanie to automatycznie wydane, gdy skończysz, więc unikniesz również wycieków pamięci ...

Mam nadzieję, że to pomoże!

h4xxr
źródło
Zastanawiałem się nad tym. Często widzę zmienne łańcuchowe, które są obiektywnymi obiektami c, ale nigdy nie są publikowane. Dzięki!
Bryan
2
Wskazówka znajduje się w bicie „alokacji”. Jeśli używasz Alloc (lub Copy), musisz specjalnie zwolnić. Jeśli tego nie zrobisz, konwencja jest taka, że ​​obiekt będzie już ustawiony na automatyczne zwalnianie.
h4xxr
Tak, chociaż może zawierać newlub copyna przykład newObject(from NSDictionaryController) lub mutableCopy(from NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/ ...
Alex Różanski
2

Możesz także użyć metod klasy NSString, które również utworzą instancję autoreleased i mają więcej opcji, takich jak formatowanie ciągów:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
danielpunt
źródło