Hala bilmeniz gereken birincil bellekle ilgili sorun, döngüleri korumaktır. Bu, bir nesnenin diğerine güçlü bir işaretçisi olduğunda, ancak hedef nesnenin orijinaline güçlü bir işaretçisi olduğunda oluşur. Bu nesnelere yapılan tüm diğer referanslar kaldırılsa bile, birbirlerine tutunacak ve serbest bırakılmayacaklardır. Bu, dolaylı olarak, zincirde sonuncusu daha önceki bir nesneye atıfta bulunabilecek bir nesne zinciri tarafından da olabilir.
Bu nedenle __unsafe_unretained
ve __weak
sahiplik niteleyicileri mevcuttur. Birincisi işaret ettiği herhangi bir nesneyi tutmayacak, ancak o nesnenin kaybolma ve kötü belleğe işaret etme olasılığını açık bırakırken, ikincisi nesneyi tutmuyor ve hedefi yeniden yerleştirildiğinde kendini otomatik olarak sıfır olarak ayarlıyor. Bu ikisinden __weak
genellikle onu destekleyen platformlarda tercih edilir.
Bu niteleyicileri, nesnenin temsilcisini korumasını ve potansiyel olarak bir döngüye yol açmasını istemediğiniz temsilciler gibi şeyler için kullanırsınız.
Belleğe ilişkin önemli bir başka endişe Core Foundation nesnelerinin işlenmesi ve malloc()
benzeri tipler için ayrılan bellektir char*
. ARC bu türleri yönetmez, sadece Objective-C nesnelerini yönetir, bu yüzden hala kendinizle başa çıkmanız gerekir. Çekirdek Temel türleri özellikle zor olabilir, çünkü bazen eşleşen Objective-C nesnelerine ve tam tersine köprülenmeleri gerekir. Bu, CF tipleri ile Objective-C arasında köprü oluştururken kontrolün ARC'den ileri geri aktarılması gerektiği anlamına gelir. Bu köprüleme ile ilgili bazı anahtar kelimeler eklendi ve Mike Ash, uzun ARC yazımında çeşitli köprüleme vakalarının harika bir açıklamasına sahip .
Buna ek olarak, yayınlanan spesifikasyonun ayrıntılı olarak ele alındığı daha az sıklıkta, ancak yine de potansiyel olarak problemli olan başka durumlar da vardır .
Nesneleri güçlü bir işaretçi olduğu sürece etrafta tutmaya dayanan yeni davranışların çoğu, Mac'teki çöp toplama işlemine çok benzer. Ancak, teknik temeller çok farklıdır. Artık işaretlenmeyen nesneleri temizlemek için düzenli aralıklarla çalışan bir çöp toplayıcı işlemine sahip olmak yerine, bu bellek yönetimi tarzı, Objective-C'de uymamız gereken katı tutma / bırakma kurallarına dayanır.
ARC, yıllarca yapmamız gereken tekrarlayan bellek yönetimi görevlerini alır ve derleyiciye boşaltır, böylece bir daha asla endişelenmemize gerek kalmaz. Bu şekilde, çöp toplanan platformlarda yaşanan durma problemleri veya testere dişi bellek profilleri olmaz. Bunların her ikisini de çöp toplama Mac uygulamalarında yaşadım ve ARC altında nasıl davrandıklarını görmek için sabırsızlanıyorum.
Çöp toplama ve ARC hakkında daha fazla bilgi için, Chris Lattner'ın Objective-C posta listesindeki birçok amacını listelediği Objective-C posta listesinde bu çok ilginç yanıta bakın . Açıkladığı birkaç GC sorunuyla karşılaştım.