Press ESC to close

Xcode ile Nasıl Memory Leaks Tespit Edilir?

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

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir