2010-10-10 16 views
17

Bu şekilde bir NSString bildirmek için dezavantajlar ve/veya avantajlar gibi ne gibi farklılıklar olduğunu merak ediyorum:NSString üzerinde stringWithFormat vs. initWithFormat

NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i]; 

yerine

NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i]; 

stringWithFormat yerine sadece initWithFormat dizesini başlatma yolunu mu?

cevap

33

stringWithFormat:, otomatik olarak oluşturulmuş bir dizeyi döndürür; initWithFormat:, arayan tarafından serbest bırakılması gereken bir dize döndürür. Birincisi kısa ömürlü dizeler için yararlı olan bir "kolaylık" yöntemidir, böylece arayanın release'u çağırmayı hatırlaması gerekmez.

+0

Tamam, teşekkürler. –

+1

Deliğe 32 saniye boyunca dayak yendi. :-) –

+2

Aslında; Bu, korunan örneği döndüren '+ tahsisidir…' 'init *', korunma sayımını değiştirmez (ancak, bu durumda, çağrılandan farklı bir durum döndürür). – bbum

3

Ben sadece dün dün bellek optimizasyonları giriş this blog girdi. İçinde, yazar, [NSString stringWithFormat:@"..."] yerine [[NSString alloc] initWithFormat:@"..."] kullanmayı seçmesinin belirli nedenlerini verir. Özellikle, bir autorelease nesnesi oluşturursanız, iOS cihazları bellek havuzunu otomatik olarak serbest bırakmaz.

eski sürüm gerektirdiğini el release o bir yapı içinde bu gibi: İşte

NSString *remainingStr = nil; 
if (remaining > 1) 
    remainingStr = [[NSString alloc] initWithFormat:@"You have %d left to go!", remaining]; 
else if (remaining == 1) 
    remainingStr = [[NSString alloc] initWithString:@"You have 1 left to go!"]; 
else 
    remainingStr = [[NSString alloc] initWithString:@"You have them all!"]; 

NSString *msg = [NSString stringWithFormat:@"Level complete! %@", remainingStr]; 

[remainingStr release]; 

[self displayMessage:msg]; 

, remainingStr sadece geçici olarak ihtiyaç vardı ve bu yüzden de çok daha sonra ortaya çıkabilir sallanmasını (kaçınmak için program), ihtiyacım olan anıyı açık bir şekilde hallediyorum.

+1

Erken optimizasyon ve net özlü kod arasında seçim. Erken optimizasyonlar daha sonra performans analiz edilerek çözülebilir, belirsiz kod (genellikle) sonsuza dek. – zaph