2009-03-22 10 views
6

, (Ben bu herhangi NSObject ile genelleştirildiğinde varsayalım) sözlük ikinci parametre muhafaza etmez NSStringsetValue:forKey: yöntemi kullanılarak NSMutableDictionary öğe eklerken? Örneğin[NSMutableDictionary setValue: Anahtar: key for key: key] NSString anahtarını koruyor mu?

:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
NSString *theString = @"hello"; 
int i; 
for (i=0; i<[theString length]; i++){ 
    NSNumber *myInt = [NSNumber numberWithInt:i]; 
    NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]]; 
    [dict setValue: myInt forKey:character]; 
} 
[dict release]; 
[pool release]; 

Açıkça, döngüde myInt serbest bırakmak için bir neden yoktur, bunun bu nedenle kod sonuna kadar serbest olamaz dict ile tutulur. Ama aynı character doğru mu? Benim düşüncem şudur: NSMutableDictionary dizgiyi başka bir şekilde saklarsa, o zaman döngü etrafında geçici bir havuz oluşturabilir ve sözlüğün yayınlanmasına kadar beklemek yerine bu dizeleri serbest bırakabilir.

Ben bir NSConstantString ise, ben istinat gerekir bir NSString nesneyi döndürmek için stringWithFormat beklediğiniz gibi character ait retainCount 7fffffff neden olarak da merak ediyorum, ama bu durum görünmüyor.

+0

Sadece ince bir nokta: 10.4 için kod ve daha sonra, bunun yerine [havuz göçünü] kullanmak genellikle tercih edilir - GC açıkken, drenaj o * kudreti * iyi olmasını bir ipucu sağlar eski referansları toplamanın zamanı, serbest bırakma ise no-op haline gelir. GC kapalıyken, aynı şekilde çalışırlar. –

+0

Bu eski bir sorudur, ancak büyük olasılıkla 'setObject: forKey:' işlevini kullanmak istemişsinizdir. [buraya bakın] (http://stackoverflow.com/questions/1249634/wheres-the-difference-between-setobjectforkey-and-setvalueforkey-in-nsmutabl) –

cevap

8

O kakao içinde çok yaygındır. Bunun nedeni, sözlüğe bir NSMutableString örneğini verdiğinizde kolayca sahip olabileceğinizdir. Dizenin değeri değişebileceğinden, NSDictionary bir kopyasını oluşturur.

Ancak, NSMutableDictionary'un gerçekten nasıl çalıştığından bağımsız olarak, character'un korunmasının gerekip gerekmediğinden endişelenmeniz gerekmez. Bir parametre olarak NSMutableDictionary'a geçtikten sonra, gerçekten belgeleriniz size ait olan nesnelerin sizin sorumluluğunuzda olduğunu size bildirmedikçe, verilerin nasıl saklanacağına karar vermeniz gerçekten problemdir.

Ben de herhangi bir nesnenin retainCount hakkında çok fazla endişe olmaz. Bir nesnenin korunma sayısının çok yakından takip edilmesi sizi tekerleğinizi döndürmenizi sağlayan tavşan deliklerine yönlendirebilir.

Son olarak, gerçekten burada kendi sallanmasını havuzu oluşturmak için gereken sanmıyorum. Eğer theString çok uzun olacak mutlak kesin olarak biliyoruz, veya zaten sallanmasını havuzu ekleyerek Instruments yüksek bellek kullanımını gözlemledik sürece gereksiz bir iyileştirmedir. Bir cevap hak etmez

4

Orada character korumak gerekmez, sözlük bir anahtar olarak ayarlayın ve kendi kod saklayın gerek olduğunda bu durumda kalır. Ayrıca sayımı korumak neden endişelenmenize gerek yok

beklediğiniz değil. Belki de Foundation çerçevesinde tek karakterli NSString örneklerinin Flyweight benzeri örnekleri vardır. Her halükarda, bellek yönetimini yönergeleri izleyerek doğru yaptıysanız, çerçevenin perde arkasında ne yaptıklarına bakılmaksızın Tamam olacaksınız. NSString parametreler kopyalanan yerine korunacak için http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html