Sobes.tech
Middle

Чӣ гуна дар лоиҳаҳои худ аз рехтани хотираҳо пешгирӣ мекунед?

sobes.tech AI

Ҷавоб аз AI

Ман истифода мебарам чанд роҳ:

  1. ARC (Automatic Reference Counting): Ин механизм асосии идоракунии хотира дар Swift ва Objective-C мебошад. Он ба таври автоматӣ шумораи истинодҳоро ба объектҳо ҳисоб мекунад ва онҳоро вақте ки шумораи истинодҳо ба сифр мерасад, озод мекунад.
  2. Пешгирии циклҳои бо истинодҳои қавӣ: Ин сабаби маъмултарини ҷорӣ шудани хотира мебошад. Ман истифода мебарам weak ё unowned барои қатъ кардани циклҳо. Бештар дар кор бо делегатҳо ва closureҳо рӯй медиҳад.
  3. Асбобҳои профилинг: Ман мунтазам аз асбобҳои Xcode, мисли Instruments (Allocator, Leaks), барои ёфтани ҷойҳои ҷорӣ шудани хотира истифода мекунам.
  4. Таҳқиқи closureҳо: Ман closureҳоро бодиққат тафтиш мекунам, махсусан вақте ки self дар онҳо захват мешавад, бо истифода аз рӯйхатҳои захват [weak self] ё [unowned self].
  5. Азхудкунии хабарномаҳо: Ман азхудкунии хабарномаҳо аз NotificationCenter ва observer-ҳо KVO дар вақти нобудшавии объектҳоро мекунам.
  6. Насб кардани observerҳо ва таймерҳо: Ман таймерҳоро отключ мекунам ва нулӣ мекунам, вақте ки онҳо дигар лозим нестанд, ва observer-ҳоро хориҷ мекунам.
  7. Идоракунии захираҳо: Ман захираҳоро, мисли файлҳо, сокетҳо ва базаҳои додаҳоро дуруст идора мекунам, онҳоро дар вақти мувофиқ мебандем ва озод мекунам.
  8. Баррасии код: Ман мунтазам кодро баррасӣ мекунам, аз ҷумла барои ёфтани мушкилоти эҳтимолӣ дар идоракунии хотира.

Масалан, истифодаи [weak self] дар closure:

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

    func fetchData() {
        // Истифодаи weak self барои пешгирии цикл қавӣ
        DispatchQueue.global().async { [weak self] in
            // Имитация гирифтани маълумот
            sleep(1)

            DispatchQueue.main.async {
                // Санҷиш барои nil пеш аз истифодаи self
                self?.completionHandler?()
            }
        }
    }
}

class ViewController {
    var fetcher: DataFetcher?

    func setupFetcher() {
        fetcher = DataFetcher()
        fetcher?.completionHandler = {
            // Ин ҷо self ҳоло метавонад суст бошад, агар fetcher ҳанӯз мавҷуд бошад
            print("Data fetched in ViewController")
        }
    }

    deinit {
        print("ViewController deinitialized")
    }
}

Масалан, истифодаи weak барои делегат:

protocol DataProcessorDelegate: AnyObject { // AnyObject кафолат медиҳад, ки типи истинодӣ аст ва пешгирӣ мекунад циклҳои қавӣ бо типҳои арзишӣ
    func processData(_ data: String)
}

class DataProcessor {
    weak var delegate: DataProcessorDelegate? // Истифодаи weak барои делегат

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

class AnotherViewController: DataProcessorDelegate {
    let processor = DataProcessor()

    init() {
        processor.delegate = self
    }

    func processData(_ data: String) {
        print("Processing data: \(data)")
    }

    deinit {
        print("AnotherViewController deinitialized")
    }
}