Memory Management and ARC

Mesut Aygun
4 min readJul 4, 2022

Merhabalar sizlerle bu yazımda paylaşmak istediğim konu uygulama geliştirirken bilmemiz gereken memory management ve dikkat edilmediği takdirde büyük olasılıkla karşılabileceğimiz memory leak yani bellek sızıntısı ve bu probleme karşı çözüm üretebileceğimiz methodlardan bahsetmek istiyorum.

  1. Strong Reference
  2. ARC
  3. Retain Cycle
  4. Weak Reference

Daha önceden oluşturulan nesneler için memory management(bellek yönetimini)’ i manuel olarak geliştiriciler kendileri yaparlardı. Örneğin bellek yığınında Gamer nesnemize yer açmak için;

Gamer.alloc()

ya da bellekteki o yeri serbest bırakmak için ;

Gamer.release()

Bu durum çok sayıda nesne olduğunda zahmetli durumlar ortaya çıkması kaçınılmaz oluyordu. Bu problemi çözmek için Apple geliştiridiği ARC teknolojisi ile memory management sorununu ortadan kaldırdı.

ARC (Auto Reference Counting)

ARC uygulamamızda yarattığımız nesneleri takip ederek ihtiyaç duyulmayan nesnelerin bellekteki yerlerini siler.

Bu işlemi yapabilmesi için nesnemizin reference count sayısına göre belekteki durumuna karar verir. Reference sayısı 0 ise ARC bu nesnenin bellekteki yerini silinmesine karar verir ve bellekteki yeri serbest bırakır. Aksi durumda ise nesneye strong reference olduğunda reference sayısını 1 arttırır. Peki strong ve weak reference nedir?

STRONG
WEAK

Default olarak var ile oluşturduğumuz nesneler strong reference’dir ve ARC reference sayısını 1 arttırır.

var team = “M.United”  // strong reference ve reference count +1

Strong reference olan bu nesnenin bellekteki yerini serbest bırakmak için ,

var team = nil         // reference count 0  

yapmamız yeterli. Arka planda ARC devreye giriyor ve team nesnesinin reference count sayısını 0 yaparak bellekteki yeri serbest bırakıyor. Bu durumu deinit() methodu kullanılarak gözlemleyebiliriz.

Retain Cycle

Tek bir strong reference nesnenin bellekteki yerini serbest bırakmayı öğrendik. Fakat iki nesne birbirlerine yukarıdaki şemaya benzer atıfta bulunuyorsa ;

Burada dikkat ederseniz Player in team nesnesi ve Team in player nesnesi var.

player = nilteam = nil

Normal şartlarda nil olarak atadığımız nesneler reference count sayısını 0 a çekerek bellekteki yeri serbest bırakması gerekirken, bu iki nesnenin birbirine olan bağımlılıkları dolayısıyla ARC bu iki nesnenin reference count unu her zaman 1 olarak tutar. Aslında bu olay Retain Cycle olayıdır ve bellek sızıntısına neden olur. Peki bu durumdan kurtulmak için ne yapılması gerekir ?

Weak Reference

Strong reference ile oluşturulan nesneler yukarıda gördüğümüz gibi memory leak lere neden olan retain cycle lara neden olabilir.Reference count 1 olan nesnenin bellekteki yeri serbest bırakılamaz. Bu durumda yardımımıza weak koşuyor. Strong reference bağını koparmak ve retain cycle dan çıkıp Reference count u 0 yapabilmemiz için nesnemizi

yukarıdaki Team ve Player classı içerisindeki properylerimizden herhangi birisini weak var ile oluşturmalıyız ;

weak var team = Team?  // Player class' ı içerisindeki property

artık strong reference yerine weak reference ile oluşturulan bir bağ var ve biz bu nesneleri nil yaptığımızda Retain Cycla oluşmayarak reference count 0 olacak ve istenilen durum yani bellekteki yeri serbest bırakma başarıyla gerçekleştirilecektir.

[weak self]

Clousure larda ise memory leak durumunu engellemek için weak self kullanırız. Self kullanan bir sınıfımız ve içerisinde clousere varsa clousere selfe strong reference olacaktır. Bu duruma örnek verecek olursak ;

Biz timer.invalidate() ve nil değeri vererek timeri durdursak bile bellekteki yerini ARC silemez çünkü strong reference ile bağlı olan clousere ve self ARC nin reference count u 0 yapmasını engelliyor.

Yaşanan memory leak olayını aşabilmek için ;

Clousere da tanımladığımız weak self sayesinde Retain Cycle döngüsüne girmedi ve beklenen durum ARC tarafında reference count 0 yapılarak bellek serbest bırakıldı.

Sizlere bu yazımda uygulama geliştirilirken mutlaka dikkat edilmesi gereken Memory Management, Memory Leak, ARC, Strong Reference ve Weak Reference kavramlarından bahsetmeye çalıştım. Umarım faydalı olmuştur herkese sağlıklı keyifli günler dilerim.

--

--