1. ARC Nedir ve Neden Önemlidir?
Öncelikle ARC hakkında kısa bir hatırlatma yapalım. ARC, Automatic Reference Counting (Otomatik Referans Sayma), Swift ve Objective-C dillerinde kullanılan bir hafıza yönetim tekniğidir. ARC, her nesnenin ne zaman hafızadan temizleneceğini belirlemek için nesnelerin referans sayısını takip eder. Bu, geliştiricilerin nesneleri manuel olarak serbest bırakmak zorunda kalmalarını ortadan kaldırır ve uygulamalarının hafıza sızıntılarından korunmasını sağlar.
Ancak bu kadar basit bir şeyle yetinmek, işin püf noktasını kaçırmak anlamına gelir. ARC’ın derinliklerine indiğinizde, doğru referans yönetimi ve güçlü ve zayıf referanslar arasındaki farkları anlamak çok önemlidir. İşte burada devreye giren altın kurallar devreye giriyor!
2. Altın Kural: Her Zaman Zayıf Referansları Kullanın!
Bir nesne, başka bir nesne tarafından tutuluyorsa ve bu tutma ilişkisi iki yönlü ise, yani her iki nesne de birbirine referans veriyorsa, bu durum strong reference cycle (güçlü referans döngüsü) olarak bilinir ve hafıza sızıntılarına yol açar. Bu durumu engellemek için, nesneler arasında güçlü referanslar yerine zayıf referanslar kullanmanız çok önemli.
Örnek: Bir ViewController’ın içindeki bir nesne, ViewController’a güçlü bir referans tutuyorsa, bu nesne bir daha serbest bırakılmayabilir. Bunun yerine, nesneye zayıf referans tutarak bu döngüyü kırabilirsiniz.
class SomeClass {
var name: String?
}
class ViewController: UIViewController {
var obj: SomeClass? // strong reference
}
3. Altın Kural: Nilable Referanslar ile Hafıza Sızıntılarını Engelleyin
Hafıza yönetiminin karmaşık kısmı, nesnelerin sadece strong ya da weak referanslarla tutulmadığı durumlardır. Nesneleri tutarken, optional yani nilable (değer alabilir) referanslarla kullanmak çok yararlı olabilir.
Örnek: Bir nesnenin sadece ihtiyaç duyulduğunda tutulmasını sağlamak, onun gereksiz yere belleği işgal etmesini engeller.
class SomeClass {
var name: String?
}
class ViewController: UIViewController {
var obj: SomeClass? // Optional reference
}
4. Altın Kural: Unutmayın, ARC Her Zaman Her Şeyi Otomatik Yapmaz!
Evet, ARC otomatik olarak hafızayı yönetiyor fakat her zaman her şeyin sorumluluğunu ona bırakmamalısınız. Örneğin, delegates ve closure'lar gibi yapılar güçlü referans döngülerine yol açabilir.
Örnek: Bir closure, içinde bulunduğu sınıfın kendisine güçlü referans tutuyorsa, bu da hafıza sızıntısına yol açabilir. Bunun önüne geçmek için bu tür durumlarda [weak self] kullanarak referans döngüsünü kırabilirsiniz.
class ViewController: UIViewController {
var obj: SomeClass?
func fetchData() {
someClosure = { [weak self] in
self?.doSomething()
}
}
}
5. Altın Kural: Objelerin Sonlandırılmasını Beklemek
ARC, bir nesneye olan son referans kaybolduğunda otomatik olarak bu nesneyi hafızadan temizler. Ancak, bazı durumlarda bir nesneye olan tüm referanslar kaybolmadan önce temizlenmesi gereken kaynaklar olabilir.
Örnek: Bir nesne üzerindeki önemli bir iş bitirilmeden serbest bırakılmamalıdır. Bu gibi durumlar için deinit metodunu kullanarak özel temizlik işlemleri gerçekleştirebilirsiniz.
class SomeClass {
deinit {
print("Nesne hafızadan temizlendi!")
}
}
6. Altın Kural: Arc ile Güçlü ve Zayıf Referansları İyi Anlayın
Güçlü referanslar, nesnelerin bellekte tutulmasını sağlar, ancak referanslar arasında bir döngü varsa, bu hafıza sızıntılarına yol açabilir. Zayıf referanslar, bir nesneye olan bağımlılığı kırmak için kullanılır, ancak nesne yok olduğunda, zayıf referansın nil olması gerektiğini unutmamalısınız.
7. Altın Kural: Hafıza Sızıntılarını Tespit Etmek İçin Araçlar Kullanın
Xcode, iOS uygulamalarınızda hafıza sızıntılarını tespit etmek için güçlü araçlar sunar. Özellikle Instruments aracı, hafıza kullanımını izleyerek potansiyel sızıntıları belirlemenize yardımcı olabilir. Bu araçları kullanarak uygulamanızda sorun yaratabilecek referans döngülerini tespit edebilirsiniz.
8. Altın Kural: Nesne Yaşam Döngüsünü Takip Edin
Her nesnenin bir yaşam döngüsü vardır. Bu döngüleri takip etmek, gereksiz nesnelerin hafızada tutulmasını engeller ve uygulamanızın performansını artırır.
9. Altın Kural: Her Referansı Dikkatle İnceleyin
Kod yazarken, her referansı dikkatlice incelemek, olası hafıza sızıntılarının önüne geçmek için önemlidir. Özellikle closure'lar ve delegates gibi yapılarda dikkatli olmalısınız.
10. Altın Kural: Hafızayı Temizlemek İçin Manuel Müdahale Gerektiğinde Müdahale Edin
ARC çoğu zaman yeterli olsa da, bazen geliştiricilerin manuel müdahaleye ihtiyaç duyduğu durumlar olabilir. Örneğin, büyük veri setlerini işlediğinizde ya da çok fazla nesneyle çalıştığınızda, hafıza yönetimini daha etkili yapmak için manuel olarak temizleme yapabilirsiniz.