2010-05-16 15 views
7

Durultma soru Takip:a takibi olarak viewDidUnload vs dealloc soru

What exactly must I do in viewDidUnload? When should I release objects in -(void)viewDidUnload rather than in -dealloc?

Öyleyse bir düşük bellek hatası var diyelim ve görünümü gizli ve viewDidUnload denir. Serbest bırakma ve nil dansı yapıyoruz. Daha sonra tüm görünüm yığını gerekli değildir, bu nedenle dealloc çağrılır. ViewDidUnload'da zaten sürüm ve sıfır şeylere sahip olduğum için, bunu dlllloc içinde yok. Mükemmel.

Ancak düşük bellek hatası yoksa, viewDidUnload hiçbir zaman çağrılmaz. dealloc denir ve serbest bırakma ve sıfır şeylere sahip olmadığımdan, bir bellek sızıntısı vardır.

Başka bir deyişle, ilk olarak viewDidUnload çağrılmadan dealloc çağrılabilir mi?

Ve bunun pratik bir uygulaması, eğer viewDidLoad'a bir şey atar ve ayarlarsam ve onu serbest bırakıp viewDidUnload'da sıfır olarak ayarladığımda, onu dlllloc dışında bırakabilir miyim, yoksa bir defansif nil check in yapabilir miyim? nil olmasaydı, boş bırakın ve bırakın/bırakın?

+3

Nil bir sürüm mesajı sorun olmadan gönderebilirsin, değil mi? nil sadece kendisine gönderilen tüm mesajları yok sayar ve hata olmadan değer olarak sıfırlar. NULL –

cevap

8

Her ikisinde de bırakın. Nil için kontrol etmene gerek yok. Nil serbest bırakmak hiçbir şey yapmaz.

Ancak, viewDidUnload görünümünde, görünüm yeniden yüklendiğinde, viewDidLoad uygulamasında kolayca yeniden oluşturamayacağınız ivar'ları yayınlamayın.

Normalde (bellek uyarıları yok) viewDidUnload çağrılmaz, yalnızca dealloc çağrılır.

+0

ile nil gibi savunma kontrolüne gerek yok İyi hijyen için, bir sıfır seti dealloc içinde yapılmalı mı? – alyssackwan

+0

Güvende olmak için evet, ama sadece önemli olduğu birkaç durumu düşünebilirim. Setter'ı sıfırlamak için kullanmaktan hoşlanırım, çünkü onu serbest bırakır ve bir satırda sıfırlamaya ayarlar (yani: self.ivar = nil;) – progrmr

+6

İvarları 'dealloc'da 'nil' olarak ayarlamak için hiçbir neden yoktur. Ayrıca, Apple'ın “dealloc” (yani self.ivar = nil') içindeki dizileri kullanma önerilerine aykırıdır, çünkü kısmen ayrılmış olan bir nesnede ayarlayıcıların kullanılmasıyla ilgili bir sorun olabilir. Büyük olasılıkla setter kullanmak bir problem değildir, ancak% 100 güvenli olmak için '[ivar release]' i kullanabilirsiniz. – shosti