
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