Ne işe -(void)viewDidUnload
yarar?
Her şeyi sadece yeniden anlatamaz -dealloc
mıyım? Görünüm kaldırılsaydı, -dealloc
yine de çağrılmaz mıydı?
Ne işe -(void)viewDidUnload
yarar?
Her şeyi sadece yeniden anlatamaz -dealloc
mıyım? Görünüm kaldırılsaydı, -dealloc
yine de çağrılmaz mıydı?
Yanıtlar:
Daha önce belirtilmiş olana ek olarak, mantık hakkında daha fazla detay vermek istedim -viewDidUnload
.
Bunu uygulamanın en önemli nedenlerinden biri, UIViewController
alt sınıfların genellikle görünüm hiyerarşisindeki çeşitli alt görünümlere ait referansları da içermesidir. Bu özellikler , örneğin IBOutlets
bir uçtan yüklenirken veya programlı olarak içeride ayarlanmış olabilir -loadView
.
Alt görünümlerin ek mülkiyeti UIViewController
, görünümü görünüm hiyerarşisinden kaldırıldığında ve hafızadan tasarruf etmek için serbest bırakıldığında bile, alt görünümlerin de görünüm tarafından serbest bırakıldığı durumlarda, gerçekte ayrılmayacaktır çünkü UIViewController
kendisi hala kendi olağanüstü halini içermektedir. bu nesnelere referansları korumak. UIViewController
Bu nesnelerin ek sahipliğinin serbest bırakılması, bellek boşaltmak için bunların yanı sıra ayrılmalarını sağlar.
Burada serbest bıraktığınız nesneler genellikle yeniden oluşturulur ve UIViewController
görünüm re-loaded
bir Uçtan ya da -loadView
.
Ayrıca, UIViewController
view
özelliğin, nil
bu yöntemin çağrıldığı zaman olduğunu unutmayın .
Gibi belgeler diyor :
Düşük bellek koşullarında, görünüm denetleyicisinin belleği boşaltmak için görünümünü ve bu görünümle ilişkili nesneleri serbest bırakması gerektiğinde çağrılır.
Aynı durumda dealloc
olan değil denir. Bu yöntem yalnızca OS3 ve üzeri sürümlerde mevcuttur. İPhone OS 2.x'de aynı durumla başa çıkmak gerçek bir acıydı!
Temmuz 2015 Güncellemesi : viewDidUnload
"Görünümler artık düşük bellek koşullarında temizlenmediği ve bu nedenle bu yöntem hiçbir zaman çağrılmadığı" için iOS 6'da kullanımdan kaldırıldığını belirtmek gerekir . Yani, modern tavsiye bunun için endişelenip kullanmamaktır dealloc
.
Bu genellikle koyacaktır nedeni @property
olarak "(nonatomic, retain)"
ve geçerli nesneyi serbest bırakır için oluşturulan bu tür koyucu olarak ve daha sonra argüman ie korur
self.property = nil;
... şu satırlarda bir şey yapar:
[property release];
property = [nil retain];
Bu nedenle, bir taşla iki kuş vuruyorsunuz: hafıza yönetimi (mevcut nesneyi serbest bırakmak) ve işaretçiyi sıfıra atamak (bir sıfır işaretçisine herhangi bir mesaj göndermek sıfıra döneceğinden).
Umarım yardımcı olur.
Bunun viewDidUnload
görünümde değil, görünüm denetleyicisinde bir yöntem olduğunu unutmayın . Görünümün dealloc
yöntem zaman görünümü kaldırılırken denilen olsun, ancak görünüm kontrolörün dealloc
yöntem sonrasına kadar denilen edilmeyebilir.
Düşük bellek uyarısı alırsanız ve görünümünüz görünmüyorsa, örneğin kullanıcının bir resim çekmesine izin vermek için bir UIImagePickerController kullandığınızda bu durum meydana gelir, görünümünüz kaldırılır ve bundan sonra yeniden yüklenmesi gerekir.
Sonuç:
Görünüm Denetleyicilerinin bir görünüm özelliği vardır. Genellikle bir uç veya kod parçası bu görünüme başka görünümler ekler. Bu genellikle bir -viewDidLoad yöntemi içinde şu şekilde gerçekleşir:
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
ek olarak, bir uç dosyası bir düğme oluşturabilir ve bunu görünüm denetleyicisinin görünümüne ekleyebilir.
İPhone OS 2.2'de, sistemden -didReceiveMemoryWarning çalıştırıldığında, belleği boşaltmak için bir şeyler yayınlamanız gerekiyordu. Bu mantıklıysa, tüm görüntü denetleyicisinin görüşünü serbest bırakabilirsiniz. Ya da sadece büyük hafıza tüketen içerikler.
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
Şimdi, yeni OS 3.0'da, düşük bellek nedeniyle görünüm kaldırıldığında sistemden çağrılacak bir -viewDidUnload yöntemi var (lütfen beni düzeltin: bu tam olarak ne zaman çağrılıyor?)
-viewDidUnload, hem görünüm denetleyicisinin hem de görünümün sahip olduğu tüm nesneleri serbest bırakmak için kullanılır. Nedeni: Bir görünüm denetleyicisi görünümün alt öğelerine, yani bir düğmeye, başvurulara sahipse, başvurulan alt görünümler serbest bırakılmayacaktır çünkü tutma sayıları> = 1'dir. İn -viewDidUnload yayınlandıktan sonra serbest bırakılabilirler. hafızadan.
Apple kullanımdan kaldırıldı viewWillUnload, şimdi objetc'lerinizi serbest bırakmak için didReceiveMemoryWarning veya dealloc kullanmanız gerekir.
İOS 6'da, UIViewController'ın viewWillUnload ve viewDidUnload yöntemleri artık kullanımdan kaldırılmıştır. Verileri serbest bırakmak için bu yöntemleri kullanıyorsanız, bunun yerine didReceiveMemoryWarning yöntemini kullanın. Bu yöntemi, kullanılmıyorsa, görünüm denetleyicisinin görünümüne başvuruları yayınlamak için de kullanabilirsiniz. Bunu yapmadan önce görünümün bir pencerede olmadığını test etmeniz gerekir.
Görünüm denetleyicisi gezinti denetleyicisi yığınından çıkarılırsa ve başka hiçbir yerde tutulmazsa, serbest bırakılır ve viewDidUnload yerine dealloc çağrılır. LoadView'da oluşturulan görünümleri dealloc'ta serbest bırakmalısınız, ancak değişkenleri nil olarak ayarlamak gerekli değildir, çünkü dealloc çağrıldıktan kısa bir süre sonra değişkenler artık mevcut olmayacaktır.