Swift Hafıza Yönetimi

Melisa Öztürk
Team Kraken
Published in
3 min readMay 3, 2021

Selamlar, bugün sizlerle bir iOS uygulamada hafıza yönetimi nasıl yapılır, hangi yapılar rol oynar, memory leak nedir, hangi koşullarda oluşur ve önlemek için neler yapabiliriz konularına değineceğiz.

Hafıza Yönetimi

Bir nesne oluşturduğumuzda bu nesnenin hafızada kaplayacağı yerin belirlenmesi, işi bitince hafızadan silinmesi gibi olaylarının gerçekleşmesi işlemlerine hafıza yönetimi deriz.

Memory Leak

Bir nesne için bellekten bir alan tahsis edilir. Bu alanı kullanan nesnenin işi bitince bu alan boşaltılır. Bu alanın boşaltılamadığı ve hiçbir zaman tekrar kullanılamadığı bazı durumlarda memory leak dediğimiz durum ortaya çıkar. Bunun sonucunda uygulamamız crash olabilir.

iOS’te hafıza yönetimini ARC (Automatic Reference Counter) dediğimiz yapı üstlenmiştir. ARC, nesneler arasında oluşan bağa göre reference count’larını yönetir ve gerektiğinde nesnelerin işgal ettiği alanları serbest bırakır. Şimdi biraz da hangi durumlar memory leak oluşumuna neden olur ve bu durumları engellemek için neler yapabiliriz bunları inceleyelim.

Reference Counting

Yaratılan her nesnenin bir reference count’u vardır ve oluşturulduğu sırada bu count 1’e eşittir. Bu nesneyi hafızadan silerken ARC reference count’u 0 yapar. Fakat bir sorunla karşılaşır ve hafızadan silemezse reference count 1 olarak kalır. Reference count’u 1 olan nesne hafızadan silinemez.

ARC’nin karşılaştığı bu sorun iki nesne arasında strong-strong referans oluşması durumudur. Burada iki nesnenin de reference count’u 1 ‘dir ve sürekli birbirlerini canlı tuttukları için hafızadan silinemezler. Bu olaya ise retain cycle diyoruz. Hafızadan silinebilmeleri için ise nesneler arasında 1–0 şeklinde bir reference count olmalıdır. Yani bir nesne canlı iken diğer nesne ölü olmalıdır. Böylece bir nesnenin işi bittiğinde hafızadan silinirken diğer nesneyi de silebilir. Hangi durumlarda retain cycle oluşur ve bu durumlar ile nasıl başa çıkabiliriz bunları inceleyelim.

1(strong)–1(strong)

Memory Leak’e Neden Olabilecek Bazı Yapılar

Bu yapıları kullanırken özellikle dikkat etmemiz gerekir. Çünkü strong-strong referans oluşturabilecek potansiyele sahip yapılardır ve bu nedenle hafızadan silinemeyebilirler. Bizim amacımız ise nesneler arasında strong-weak şeklinde bir referans oluşturmaktır. Retain cycle oluşturabilecek bazı yapılar;

  • Notification Center
  • Callback
  • Closure
  • Thread
  • Delegate

Retain Cycle Oluşumunu Önlemek İçin Neler Yapabiliriz ?

1(strong)–0(weak)

Weak:

Weak kullanmak nesnenin reference count’unu 1 arttırmayacak ve retain cycle oluşumunu engelleyecektir. Böylece ARC bu nesneyi kolayca hafızadan silecektir. Weak referanslar optional’dır. Referans ettiği nesne silindiğinde, yani runtime’da tutunacak strong referans bulamazsa otomatik olarak o da silinir ve nil olur. Bu nedenle weak yapacağımız yapıyı var olarak tanımlarız.

Referans oluşturduğu nesne kendisinden önce hafızadan siliniyorsa kullanırız.

Unowned:

Weak ile benzerdir. Farkı ise optional olmamasıdır. Nesnemizin başlangıç değeri set edilmiş olmalıdır. Bunu kullanırken dikkatli olmalıyız. Ancak nesnenin nil olmayacağını garantileyebileceğimiz bir nesneye referans etmeliyiz. Çünkü referans ettiği nesne hafızadan silinmişse run time’da hata alırız. Bu uygulamamızın crash olmasına da neden olabilir.

Referans oluşturduğu nesne kendisinde daha sonra hafızadan siliniyorsa ya da aynı anda hafızadan siliniyorlarsa kullanırız.

Memory Leak Tespiti

Uygulamada memory leak olduğundan şüpheleniyorsak fakat nereden kaynaklandığını bilmiyorsak zombie objects ya da XCode Instruments ‘lardan yararlanabiliriz.

Sizlere basit bir şekilde iOS’ta hafıza yönetiminin nasıl yapıldığını anlatmaya çalıştım. Olumlu ya da olumsuz her türlü geri dönüşünüzü bekliyor olacağım. Beğenenler için yeterli geri bildirim olursa örnekler ile dolu devam yazısında görüşebiliriz. Takipte kalın.

Daha fazlası için: https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

--

--