Sobes.tech
Middle

Projelerinizde bellek sızıntılarını nasıl önliyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Birden fazla yaklaşım kullanıyorum:

  1. ARC (Otomatik Referans Sayımı): Swift ve Objective-C'de bellek yönetiminin ana mekanizmasıdır. Nesnelere referansları otomatik olarak sayar ve referans sayısı sıfıra ulaşınca serbest bırakır.
  2. Güçlü referans döngülerinden kaçınma: Bu, en yaygın bellek sızıntısı nedenidir. Döngüleri kırmak için weak veya unowned referanslar kullanıyorum. Bu genellikle delegeler ve kapanışlar ile çalışırken olur.
  3. Profil araçları: Xcode'dan Instruments (Allocator, Leaks) gibi araçları düzenli kullanıyorum, sızıntıları tespit etmek için.
  4. Kapanışların kontrolü: Özellikle self'in yakalanması sırasında [weak self] veya [unowned self] yakalama listeleri kullanarak dikkatlice inceliyorum.
  5. Bildirimlerden çıkış: Nesneleri yok ederken NotificationCenter ve KVO gözlemcilerinden çıkış yapıyorum.
  6. Gözlemcileri ve zamanlayıcıları kaldırma: Artık ihtiyaç duyulmadıklarında zamanlayıcıları devre dışı bırakıp null yapıyorum ve gözlemcileri kaldırıyorum.
  7. Kaynakların yönetimi: Dosyalar, soketler ve veritabanları gibi kaynakları doğru şekilde yönetiyor, zamanında kapatıp serbest bırakıyorum.
  8. Kod incelemeleri: Düzenli olarak kod incelemeleri yapıyorum, potansiyel bellek yönetimi sorunlarını tespit etmek için.

[weak self] kullanımı örneği:

class DataFetcher {
    var completionHandler: (() -> Void)?

    func fetchData() {
        // Güçlü döngüyü önlemek için weak self kullanımı
        DispatchQueue.global().async { [weak self] in
            // Veri alma simülasyonu
            sleep(1)

            DispatchQueue.main.async {
                // self kullanmadan önce nil kontrolü
                self?.completionHandler?()
            }
        }
    }
}

class ViewController {
    var fetcher: DataFetcher?

    func setupFetcher() {
        fetcher = DataFetcher()
        fetcher?.completionHandler = {
            // Burada, fetcher hala varsa, self zayıf olabilir
            print("Veri alındı ViewController'da")
        }
    }

    deinit {
        print("ViewController yok edildi")
    }
}

weak kullanımı örneği, delegate için:

protocol DataProcessorDelegate: AnyObject { // AnyObject referans tipi sağlar ve güçlü döngüleri önler
    func processData(_ data: String)
}

class DataProcessor {
    weak var delegate: DataProcessorDelegate? // weak kullanımı

    func process(_ data: String) {
        delegate?.processData(data)
    }
}

class AnotherViewController: DataProcessorDelegate {
    let processor = DataProcessor()

    init() {
        processor.delegate = self
    }

    func processData(_ data: String) {
        print("Veri işleniyor: \(data)")
    }

    deinit {
        print("AnotherViewController yok edildi")
    }
}