Merhaba arkadaşlar, bu yazımızda Xcode ile projemizde varolan Memory Leaks nasıl tespit edilir bundan bahsedeceğiz. Memory Leaks nedir, nasıl oluşur gibi soruların cevaplarına buradan ulaşabilirsiniz.
Yapacağımız örnek senaryoda apartman ve kiracıları ekleyip, listeleyebilen ve silebilen bir uygulama olacak. Uygulamanın 3 ekranı olacak. Bunlar Splash, Kiracı ekleme ve listeleme ekranları olacaktır. Uygulamanın çalışması aşağıdaki gibidir.
Apartman ve kiracı olarak 2 farklı modelimiz var. Apartman modelinin içerisinde opsiyonel olarak kiracı, kiracı modelimiz içinde ise olarak apartman modelimiz olacak. Çünkü apartmanda kiracı belki vardır belki yoktur ama kiracı muhakkak bir apartmanda oturmalıdır. Modellerimiz aşağıdaki gibi.
// // Apartment.swift // reference-types // // Created by Ömer Sezer on 30.05.2022. // import Foundation class Apartment { let apartmentName: String let number: Int var tenant: Tenant? init(apartmentName: String, number: Int) { self.apartmentName = apartmentName self.number = number print("Apartment \(apartmentName) initialized") } deinit { print("Apartment \(apartmentName) deinitialized") } }
// // Tenant.swift // reference-types // // Created by Ömer Sezer on 30.05.2022. // import Foundation class Tenant { let tenantName: String var apartment: Apartment? init(tenantName: String) { self.tenantName = tenantName print("Tenant \(tenantName) initialized") } deinit { print("Tenant \(tenantName) deinitialized") } }
Uygulamamızda Memory Leaks oluşup oluşmadığını kontrol etmek için Instrument uygulaması içerisinde Leaks’i seçmemiz gerekiyor.
Ardından uygulamamızı başlatıp Memory Leaks oluşup oluşmadığını kontrol edebiliriz.
Gif’te gördüğünüz gibi aslında yeni bir kiracı ekleyip ardından sildiğimiz zaman Memory Leaks oluştuğunu ve bunu hangi modellerde olduğunu görebiliyoruz.
Sebebi ise apartman ve kiracı modellerimiz birbirine Strong olarak tuttuğu için listeden silsek bile 0’a düşmüyor. Bu nedenle hiç kullanmadığımız model RAM’de yer tutumaya devam ediyor. Apartman modelimiz içinde bulunan kiracı değişkenimizi Weak olarak tanımlamalıyız. Düzelttiğimiz modelimiz şu şekilde oluyor.
// // Apartment.swift // reference-types // // Created by Ömer Sezer on 30.05.2022. // import Foundation class Apartment { let apartmentName: String let number: Int weak var tenant: Tenant? init(apartmentName: String, number: Int) { self.apartmentName = apartmentName self.number = number print("Apartment \(apartmentName) initialized") } deinit { print("Apartment \(apartmentName) deinitialized") } }
// // Tenant.swift // reference-types // // Created by Ömer Sezer on 30.05.2022. // import Foundation class Tenant { let tenantName: String var apartment: Apartment? init(tenantName: String) { self.tenantName = tenantName print("Tenant \(tenantName) initialized") } deinit { print("Tenant \(tenantName) deinitialized") } }
Gifte gördüğünüz gibi artık listeden bir model silince Memory Leaks oluşmuyor.
Projeyi daha detaylı incelemek için buradan ulaşabilirsiniz. Sorularınız olursa mail veya yorum atarak bana ulaşabilirsiniz.
Bir yanıt yazın