Bellek Yönetimi

Çoğu Java geliştiricisinin kafasındaki ilk soru, bellek yönetiminin J2ObjC tarafından nasıl uygulandığıdır. Çünkü Java'da çöp toplama işlevi vardır ve Objective-C varsayılan olarak bunu yapmaz. iOS'te iki bellek yönetimi yöntemi bulunur: referans sayma ve Otomatik Referans Sayma (ARC).

J2ObjC, seçilen yönteme bağlı olarak farklı bellek yönetimi kodu oluşturur. ARC kullanan kod oluşturmak için -use-arc seçeneğiyle çeviri yapın. Varsayılan olarak manuel referans sayımını kullanır.

Referans Sayma

Referans sayma yöntemi, nesne sahipliğini açık hale getirir. Bir yöntem, bir nesneyi oluşturduğunda bu nesneyi serbest bırakana kadar o nesneye sahip olur. Başka bir yöntemden nesne alınırken alma yöntemi, yöntem döndürüldükten sonra referans verilmesi gerekiyorsa nesneyi korur. Bir yöntemin artık bir nesneye referans vermesi gerekmediğinde, bu yöntemi serbest bırakmalıdır. Bir nesnenin tutma sayısı sıfır olduğunda belleği serbest bırakılır ve nesne artık geçerli olmaz. Nesneler serbest kaldığında, örnek değişkenlerinin sahipliğini bırakmak içinDealloc() yöntemi çağrılır.

Bu teknikteki sorunlardan biri, bir nesnenin sahipliğinin nasıl aktarılacağıdır. Örneğin, bir nesne oluşturmak için fabrika yöntemi çağrılabilir. Fabrika yöntemi, nesneyi geri döndürmeden önce serbest bırakırsa (artık nesneye sahip olmak istemediği için) çağrı yöntemi tutmadan önce söz konusu nesne serbest bırakılır.

Bir nesnenin sahipliğini aktarmak için bir yöntem, nesneye sürüm mesajı yerine otomatik yayınlama mesajı gönderir. Bu mesaj, yayınlama mesajını erteler. Bu, fabrika yönteminin döndürülecek bir nesne oluşturmasına ve nesneyi geçersiz kılmadan sahipliğinden vazgeçmesine olanak tanır. Düzenli aralıklarla (ör. bir iOS uygulamasındaki her etkinlik döngüsü yinelemesinden sonra) otomatik yayın havuzu "boşaltılır". Yani bu havuzdaki tüm nesnelere, ertelenen sürüm mesajları gönderilir. Tutma sayısı sıfıra düşen nesneler normal şekilde serbest bırakılır.

Bellek yönetiminin yükü geliştiricide olduğundan referans sayma yöntemiyle bellek kolayca sızdırılabilir. Bununla birlikte Apple, J2ObjC'nin uyguladığı bu sorunu en aza indirmek için bazı en iyi uygulamaları önerir.

Bellek sızıntılarını tespit etmek için çalışma zamanı ve araç desteği de vardır. Objective-C çalışma zamanı, bir uygulama çıktığında algılanan tüm sızıntıları bildirir. Bu, J2ObjC'nin, JUnit testlerini yürütülebilir ikili programlara dönüştürmesinin bir nedenidir. Xcode, Clang kullanır. Bu derleyicinin, Xcode'un Analiz komutuyla sunduğu bellek sorunları için mükemmel statik analizi vardır.

Otomatik Referans Sayma (ARC)

ARC, Apple'ın önerilen bellek yönetimi yöntemidir. Referans sayma sorumluluğunu derleyiciye taşır. Böylece derleme sırasında uygun muhafaza, yayınlama ve otomatik yayınlama yöntemlerini ekler. ARC, iOS 5 ve sonraki sürümleri çalıştıran cihazlar için zayıf referansları destekler.

Projelerde, çevrilmiş kod için ARC'nin kullanılması önerilir. Aktarılan Objective-C kodu, elle yazılmış Objective-C kodu gibidir. ARC'yi kullanmak, geliştiricilerin aşırı serbest bırakma veya yetersiz başvuru gibi bellekle ilgili yaygın hatalardan kaçınmasına yardımcı olarak bellek yönetimini basitleştirir ve hataya daha az açık olmasını sağlar.

Varsayılan olarak ARC'nin istisna açısından güvenli olmadığını unutmayın. Özellikle, istisnalar atlandığında bellek sızdırır. İstisnalar Java'da daha yaygın olduğundan ve genellikle kurtarılabilir durumda olduğundan bu durum sorunlu olabilir. Yay ile derleme yaparken -fobjc-arc-exceptions kullanılması, sızıntıları kabul edilebilir performans maliyetiyle düzeltir.

Ayrıca yeni projelerin, elle yazılmış Objective-C kodları için ARC'yi kullanmasını ve yalnızca profil oluşturma verileri gerçek bir performans sorunu gösterdiğinde manuel referans sayımına geri dönmesini öneririz. Hem ARC hem de ARC dışı kodlar sorunsuz şekilde derlenip aynı uygulamaya bağlanabilir.

Zayıf Referanslar

Alanlar, com.google.devtools.j2objc.Weak ile ek açıklama alabilir. Aktarıcı, bu özelliği Objective-C zayıf referans semantiğini takip eden alanlar oluşturmak için kullanır. Referans sayımı kullanılırken bu alan, başlatılırken tutulmaz ve içeren örnek serbest bırakıldığında otomatik olarak serbest bırakılır. ARC ile zayıf alanlar __unsafe_unretained notlamasıyla işaretlenir ve ilgili özelliklerin zayıf olduğu kabul edilir.

Bazı durumlarda, iç sınıf örneği, dış örneğiyle bir referans döngüsüne girer. Burada, iç sınıfı işaretlemek için bir com.google.devtools.j2objc.WeakOuter ek açıklaması kullanılır. Bu nedenle, dış sınıfa başvuru yukarıda açıklandığı gibi ele alınır. İç sınıftaki diğer alanlar bu ek açıklamadan etkilenmez.

J2ObjC, WeakReference sınıfını da destekler. Dolayısıyla, bu sınıfı kullanan Java kodu çevrildiğinde aynı şekilde çalışır. WeakReference, JVM'de doğası gereği belirsizdir. Tahmin edilebilirliği korurken bellek sızıntılarını önlemek isteyen uygulamalar bunun yerine @Weak ve @WeakOuter'yi tercih etmelidir.

Bellek Yönetimi Araçları