Bir değişkenle karşılaştırmadan önce bir dizge atamak gerekli midir?


85

An'ın değerini NSString"Yanlış" dizesiyle karşılaştırmak istiyorum . İşte kodum:

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

"Yanlış" için gerçekten bir NSString oluşturmam gerekiyor mu?

Ayrıca, bir değerini karşılaştırabilirsiniz UILabel's textbir dizeye etiket değeri atamadan bir dizeye?


Bu arada, initWithFormat ile zaman kaybediyorsunuz, NSString * wrongTxt = [[NSString ayırma] initWithFormat: @ "Wrong"]; NSString'e * wrongTxt = @ "Yanlış"; Diğer girdilerden bir dizge hesaplamaya çalışacaksanız initWithFormat ile uğraşın, örneğin NSString * falseTxt = [[NSString ayırma] initWithFormat: @ "% @ yanlış% d kez", craigString, wrongCount];
Craig

Yanıtlar:


178

"Yanlış" için gerçekten bir NSString oluşturmam gerekiyor mu?

Hayır, neden sadece yapmıyoruz:

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

Kullanımı @""basitçe geçerli bir dize değişmezi oluşturur NSString.

Ayrıca, etiket değerini bir dizeye atamadan bir UILabel.text değerini bir dizeyle karşılaştırabilir miyim?

Evet, aşağıdaki gibi bir şey yapabilirsiniz:

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

Bu çalışır. Sanırım sadece buggy kodum var. Daha önce bir istisna yapıyordu.
Bryan

1
Ayrıntılı için: label.text IS Tabii karşılaştırma için ondan bir dize oluşturmak için gerek kalmaz ait bir dize.
Amagrammer

26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}

Teşekkürler wevah. Perspx 1 saniye daha hızlıydı.
Bryan

8

Brian, ayrıca buraya atılmaya değer - diğerleri elbette doğru, bir dizge değişkeni bildirmenize gerek yok. Ancak, bir dahaki sefere bir dizeyi bildirmek istediğinizde aşağıdakileri yapmanız gerekmez:

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

Yukarıdakiler işe yarasa da, tutulan bir NSString değişkeni sağlar ve bunu kullanmayı bitirdikten sonra açıkça yayınlamanız gerekir.

Bir dahaki sefere bir dize değişkeni istediğinizde "@" sembolünü çok daha uygun bir şekilde kullanabilirsiniz:

NSString *myString = @"SomeText";

Bu, bitirdiğinizde otomatik olarak yayınlanacak, böylece bellek sızıntılarını da önleyeceksiniz ...

Umarım yardımcı olur!


Bunu merak ediyordum. Sıklıkla nesnel c nesneleri olan dize değişkenleri görüyorum, ancak bunlar asla serbest bırakılmıyor. Teşekkürler!
Bryan

2
İpucu, "tahsis" bitindedir. Bir Tahsis (veya Kopyalama) kullanıyorsanız, özellikle yayınlamanız gerekir. Bunu yapmazsanız, kural, nesnenin zaten otomatik yayınlamaya ayarlanmış olmasıdır.
h4xxr

Evet, içerebilir rağmen newya copyörneğin newObject(dan NSDictionaryController) veya mutableCopy(den NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/...
Alex Rozanski

2

Ayrıca, otomatik olarak yayımlanan bir örnek oluşturacak ve dize biçimlendirme gibi daha fazla seçeneğe sahip olacak NSString sınıfı yöntemlerini de kullanabilirsiniz:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.