SORU
7 HAZİRAN 2011, Salı


Ne tür bir sızıntı otomatik referans Objective-C sayma önlemek veya en aza indirmek değil mi?

Mac ve iOS platformları, bellek sızıntıları genellikle yayımlanmamış işaretçiler kaynaklanır. Geleneksel olarak, her zaman son derece önemli senin allocs kontrol edin, kopya edilmiş ve her ilgili serbest bir mesaj olduğundan emin olmak için korur.

Araç zinciri ile birlikte Güncellemelerinden 4.2 tanıtır otomatik referans sayma (ARC) son sürümü ile LLVM compiler, çok mu uzak bu sorunu halletmek için derleyici bellek yönetmek senin malın için. Bu çok iyi değil ve gereksiz, sıradan geliştirme zamanı çok kesin ve doğru/release dengesini korumak ile düzeltmek kolay dikkatsiz bellek sızıntıları çok fazla engel yok. Hatta autorelease havuzları Mac için ARC etkinleştirdiğinizde farklı bir şekilde yönetilmesi gerekir ve uygulamalar NSAutoreleasePoolkendi s artık ayırmak gerekmez mi gibi) iOS.

Ama nediğerbellek sızdırıyordeğilben yine de dikkat etmem lazım bunu önlemek için?

Bir bonus olarak, Mac OS X üzerinde YAY ve iOS ve Mac OS X çöp toplama arasındaki farklar nelerdir?

CEVAP
17 HAZİRAN 2011, Cuma


Yine de farkında olmak gerekir bellek ile ilgili temel sorun döngüsü korumak. Bu bir nesne başka güçlü bir işaretçi oluşur, ama hedef nesnenin güçlü bir işaretçi orijinal vardır. Bu nesneler için tüm diğer başvurular kaldırılmış olsa bile, onlar hala birbirlerine tutun ve çıkacak. Bu da dolaylı olarak, zincirdeki sonuncu olabilecek nesneleri zinciri önceki bir nesne için geri bakarak olabilir.

__unsafe_unretained __weak mülkiyet elemelerinde bulunduğunu, bu nedenle içindir. Eski değil korumak herhangi bir nesneyi işaret etmek için, ama açık bırakır ihtimali olan nesne bir yere gidiyor ve bu işaret için kötü bellek, oysa ikincisi gelmiyor korumak nesne ve otomatik olarak ayarlar kendisi için sıfır zaman hedefi olduğunu kaldırıldı. İki, __weak genellikle bunu destekleyen platformlarda tercih edilir.

Nesne temsilcisi olarak korumak ve potansiyel olarak bir döngü neden istemiyorsun nerede delegeler gibi şeyler için bu elemeleri kullanın.

Bellek kaygıları Temel nesneleri ve bellek kullanımı önemli bir kaç char* gibi türleri için malloc() kullanarak ayrılmış. ARK bu tür yönetmek değil, Objective-C nesne, bu yüzden hala onları kendiniz uğraşmak gerekir. Temel türleri bazen üzerinde Objective-C nesne eşleştirme, ve tersi Köprülü gerekir, çünkü özellikle zor olabilir. Bunun anlamı, kontrol edilmesi gereken aktarılacak ileri geri YAY zaman köprü arasında CF türleri ve Objective-C Bazı anahtar kelimeler ile ilgili bu köprü eklendi ve Mike Ash muhteşem bir açıklama çeşitli köprü durumlarda his lengthy ARC writeup.

Buna ek olarak, published specification ayrıntılı gider daha az, ama yine de sorunlu olabilecek diğer bazı durumlar vardır.

Yeni davranış, nesneleri onlara güçlü bir işaretçi var olduğu sürece tutmak etrafında dayalı, Mac çöp toplama çok benzer. Ancak, teknik altyapısı çok farklı. Yerine sahip bir çöp toplayıcı süreç çalışan düzenli aralıklarla temizlemek nesneler artık olduğunu gösteriyordu, bu tarz bellek yönetimi kullanır sert korur / serbest kurallar hepimiz için itaat Objective-C

ARC sadece yıl için yapmak zorunda olduğumuz tekrarlayan bellek yönetim görevleri alır ve biz asla onlar hakkında endişelenmenize gerek bu yüzden derleyici onları yükünü azaltır. Bu şekilde, durdurma sorunları veya testere dişi bellek profilleri çöp toplama platformlarda deneyimli zorunda değilsin. Çöp toplama Mac uygulamalarım bunların her ikisi de yaşadım, ve onlar ARK altında nasıl davrandığını görmek için istekli.

ARC vs çöp toplama hakkında daha fazla bilgi için Objective-C 2.0 çöp toplama üzerinde ARC birçok avantajı o listeler nerede this very interesting response by Chris Lattner on the Objective-C mailing list bkz. O açıklar GC sorunlar karşılaştım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FamilyFeud

    FamilyFeud

    22 AĞUSTOS 2006
  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006