2009-12-31 30 views
18

Şu anda aslında sözlükte herhangi bir nesneyi salmayan bırakma hattını bir NSMutableDictionarySözlük nasıl temizlenir?

[myDictionary release]; 
myDictionary = [[NSMutableDictionary alloc] init]; 

temizlemek için aşağıdakileri yapıyorum. Hepsini bir sonraki hatta görebiliyorum. Tahsis satırının, sözlüğün sıfırlandığını yürütene kadar olmaz. Bunu yapmanın daha iyi bir yolu var mı?

cevap

32
+0

Haklısınız. Bir sebepten ötürü, başlangıçta denediğimde kod ipucunda görünmüyordu ... bu yüzden müsait olmadığını farz ettim. Şimdi anlıyorum. Teşekkürler. – 4thSpace

+5

Bu soruya cevap vermiyor. Sözlükdeki '-release 'tüm içerilen nesneleri serbest bırakır. 4. alanın farklı bir sorunu var. – bbum

+0

Sadece bir NSDictionary yayınlarsanız ve nesneler serbest bırakılmazsa, bu nesnelerin birden fazla korumaya sahip olduğu anlamına gelir, başka bir deyişle, başka yerlerde uygun şekilde yayınlanmamakta ya da edilmemek anlamına gelmektedir. Nesneleri sözlüğe eklediğinizde, bunları düzgün bir şekilde bırakıyor musunuz (veya otomatik olarak kaldırıyor)? – lucius

6

-removeAllObjects, çalışacaktır. Bununla birlikte, sözlüğünüzün nesnelerinden herhangi biri otomatik olarak yayınlanırsa veya sözlüğün kendisi hattın herhangi bir yerinde otomatik olarak yayınlanıyorsa, o zaman runloop sona erene kadar (otorite havuzu bittiğinde) deaklloc olmaz. .

30

Diyorsun ki:

bırakma hattı sözlükte değil aslında bırakma herhangi bir nesneyi yok. Bunların tümünü bir sonraki satırda görebiliyorum. numaralı satırın, sözlüğünün sıfırlandığı yürütülür. Bunu yapmak için daha iyi bir yolu var mı?

değişken sözlük -release sözlük ayırmanın için neden olursa

- o zaman değişken Sözlük tüm nesneleri içerdiği yayınlayacak - sıfıra sayımı korumak düşer. Her zaman. nesneler serbest bırakılması değilse Böylece, o zaman bu "düzeltmeyi" önerdi

...

[myDictionary removeAllObjects]; 
[myDictionary release]; 
myDictionary = [[NSMutableDictionary alloc] init]; 

... Bir bellek NSMutableDictionary orijinal örneği sızdırılmış olacağını içinde sızıntı olduğunu. -removeAllObjects olacak Sözlük boş ve içerdiği tüm nesneleri serbest çağıran bir sonucu olarak

, ama yine de anlamaya ve düzeltmek gereken bir bellek sızıntısı var.


Açık olmak gerekirse: Sözlük (-removeAllObjects uğramadan) Yukarıdaki -release aldığında sözlükte nesneler ayırmanın değilseniz

ardından bir bellek sızıntısı yoktur. Öyle ya:

  1. sözlükte nesneler fazladan zaman muhafaza edilmiştir.

  2. Sözlükte hala olağanüstü bir -retain var.

sen ayırmanın (beklendiği gibi) varsa -removeAllObjects çağırdığınızda nesneleri düzgün ediliyor demek olduğundan, o zaman olmalıdır (2). Kodunuza bakın ve sözlüğün fazladan -retain olduğu yeri bulun. Tüm muhafazaların tam olarak nereden geldiğini anlamak için Nesne Alloc aletini kullanabilirsiniz. Apple's documentation den

+0

-removeAllObjects, arama yapmadan çalışır. Hala hafıza sızıntısı olduğunu mu söylüyorsun? – 4thSpace

+0

Evet. Sözlük sızdırıyor. – bbum

2
[aMutableDictionary removeAllObjects]; 

:

(void)removeAllObjects

Açıklaması - kendi girdilerinin sözlüğünü boşaltır. Her bir anahtar ve karşılık gelen değer nesnesine bir yayın mesajı gönderilir.

Durumu - iOS (2.0 ve üstü)