Swift için Memory Leak - II

Kurtuluş Ahmet TEMEL
3 min readApr 6, 2020

--

developer.apple.com

Selamlar Arkadaşlar,

Bildiğiniz üzere serinin ilk yazısında “Memory Leak nedir?” konusuna değinmiştik. Serinin bu yazısında ise Memory Leak tespiti konusuna değineceğim. Bu durumu tespit için Unit Test’i ve XCode Memory Graph aracını kullanacağız.

Unit Test ile Memory Leak Tespiti

Daha önceki yazımda bahsettiğim gibi iki obje arasındaki bağlantının herhangi birine weak referans olarak tanımlarsak sızma durumu (Retain Cycle) oluşmaz.

Şimdi bu durumu tespit için basitçe bir kod yazalım. Bu kodumuz togg nesnemizin sızıntı yapıp yapmadığını gözlemleyecek. weakReference nesnesine, togg nesnemizi eşitliyoruz. togg nesne referansı sıfırlandığında weakReference üzerindeki etkisini gözlemleyebiliriz. Eğer togg nesne referansı sıfırlandığında weakReference referansları da sıfırlanmıyorsa bu durumu bir sızıntı olarak kabul edebiliriz. Burada weakReference nesnemiz yerine strong olarak tanımlanan bir nesne koyarak deneyimleyebilirsiniz.

Nimble ve SpecLeaks

Kısaca Nimble yazılan Unit Test’in daha okunabilir olmasını, SpeakLeaks ise nesneler üzerinde Memory Leak durumlarını unit test içerisinde görebilmemizi sağlayan bir kütüphanedir.

Bu iki kütüphaneyi kullanarak basitçe üç test yapısından bahsedeceğim.

1. Initialization için Leak Unit Test

Bir ViewController’ın sızdırıp sızdırmadığını görmek için yazabileceğiniz en basit test aşağıdaki gibidir. Sadece ViewController’ı oluşturup testi başlatıyoruz ve sızıntı olup olmadığını gözlemliyoruz. Bazı durumlarda kullandığımız Controller sınıfları observer veya delegate sahibi olabilir. Bu tarz durumlar için bizim için küçük ama kendince önemli olan bu metod ile birkaç sızıntıyı tespit edebiliriz.

2. View Controller için Leak Unit Test

Yukarıda da gözlemlediğimiz gibi bir ViewController görünümü yüklendiğinde hemen sızmaya başlayabilir. Bunu daha net gözlemlemek için viewDidLoad çağrımını yapıp Controller sınıfımızı takip edebilir ve viewDidLoad metodumuzun sızıntı yapmaması için ekstra geliştirme yapabiliriz.

3. Method Çağrımları için Leak Unit Test

İlk iki örnekte önce init sonra viewDidLoad çağrımında uygulanacak Leak Unit Test’e değindik. Şimdi de Controller içerisinde yazdığımız özel işlevli metodların çağrımında Leak Unit Test gözlemleyeceğiz. Çünkü View Controller ilk ayağa kalktığında veya viewDidLoad yüklendiğinde sızdırmıyor olabilir ama bir delegate ve observer setlenen metod çağrımından sonra sızdırma başlayabilir. Bunun tespiti içinde aşağıdaki gibi ufak bir metodla gözlemleyebiliriz.

Xcode Memory Graph Kullanımı

Memory Graph kullanımına başlamak için öncelikle Edit Scheme ile aşağıdaki gibi ilgili Scheme ayarlarını düzenlemeniz gerekmektedir.

Sonrasında uygulamamızı derleyip bazı aksiyonları gerçekleştirdikten sonra aşağıdaki butona basarsak Memory Graph bizim için görevini yapmaya başlayacaktır.

Karşımıza çıkan yeni ekranda mor kutucuklar içerisinde ünlem görmüyorsak her şey yolunda demektir. Aksi bir durumda ise sizin için Memory Leak hataları tespit edilir ve nerede gerçekleşiyorsa satır satır bilgisi verilir. Size ise gidip bu sızıntıyı tıkamak düşer 😁

Memory Leak için anlatacaklarım şimdilik bu kadar. Sızıntı küçüktür mide bulandırır 😋🙄

Kolay gelsin.

--

--