Sobes.tech
Middle

Layihələrinizdə yaddaş sızıntılarını necə qarşısını alırsınız?

sobes.tech Süni İntellekt

AI-dan cavab

Mən müxtəlif yanaşmalardan istifadə edirəm:

  1. ARC (Avtomatik Referans Sayımı): Bu, Swift və Objective-C-də əsas yaddaş idarəetmə mexanizmidir. O, obyektlərə olan referansları avtomatik sayır və referans sayı sıfıra çatanda onları azad edir.
  2. Güclü referans döngələrindən qaçınma: Bu, ən çox rast gəlinən yaddaş sızmalarının səbəbidir. Mən weak və ya unowned referanslardan istifadə edirəm, döngələri qırmaq üçün. Bu, adətən delegatlar və closure-lərlə işləyərkən baş verir.
  3. Profil alətləri: Mən Xcode-dan Instruments (Allocator, Leaks) kimi alətləri müntəzəm istifadə edirəm, sızmaları aşkar etmək üçün.
  4. Closure-lərin yoxlanması: Closure-ləri diqqətlə yoxlayıram, xüsusən self-in tutulması zamanı, [weak self] və ya [unowned self] capture siyahıları istifadə edərək.
  5. Bildirişlərdən çıxış: Mən NotificationCenter və KVO müşahidəçilərindən obyekti məhv edərkən çıxıram.
  6. Müşahidəçiləri və timer-ləri silmək: Mən invalid edilmiş timer-ləri deaktiv edir və null edir, və artıq lazım olmayan müşahidəçiləri silirəm.
  7. Resursların idarə olunması: Mən fayllar, socketlər və verilənlər bazası kimi resursları düzgün idarə edirəm, onları vaxtında bağlayıb azad edirəm.
  8. Kodların nəzərdən keçirilməsi: Mən müntəzəm olaraq kod nəzərdən keçirirəm, hətta yaddaş idarəetməsi ilə bağlı potensial problemləri aşkar etmək üçün.

[weak self] istifadə nümunəsi:

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

    func fetchData() {
        // Güclü döngünü önləmək üçün weak self istifadə edirəm
        DispatchQueue.global().async { [weak self] in
            // Məlumatların alınmasının simulasyonu
            sleep(1)

            DispatchQueue.main.async {
                // `self`-in nil olub olmadığını yoxlayıram
                self?.completionHandler?()
            }
        }
    }
}

class ViewController {
    var fetcher: DataFetcher?

    func setupFetcher() {
        fetcher = DataFetcher()
        fetcher?.completionHandler = {
            // Burada, əgər fetcher hələ mövcuddursa, self zəif ola bilər
            print("ViewController-də məlumatlar alındı")
        }
    }

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

weak-in delegat üçün istifadəsi nümunəsi:

protocol DataProcessorDelegate: AnyObject { // AnyObject referens tipini təmin edir və güclü döngələri qarşısını alır
    func processData(_ data: String)
}

class DataProcessor {
    weak var delegate: DataProcessorDelegate? // weak istifadə olunur

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

class AnotherViewController: DataProcessorDelegate {
    let processor = DataProcessor()

    init() {
        processor.delegate = self
    }

    func processData(_ data: String) {
        print("Verilənlərin işlənməsi: \(data)")
    }

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