Sobes.tech
Middle

Жоболоруңузда эс тутумдун агып кетишин кантип алдын аласыз?

sobes.tech AI

AIден жооп

Мен бир нече ыкмаларды колдонуп жатам:

  1. ARC (Automatic Reference Counting): Бул Swift жана Objective-Cдеги негизги эс тутумду башкаруу механизми. Ал автоматтык түрдө объекттердин шилтемелерин эсептейт жана шилтемелер саны нөлгө жеткенде бошотуп салат.
  2. Күчтүү шилтемелер циклин алдын алуу: Бул эң кеңири тараган эс тутум чыгуу себеби. Мен weak же unowned шилтемелерди колдонуп циклдерди үзөм. Бул көбүнчө делегаттар жана жабык циклдер менен иштөөдө кездешет.
  3. Профилирлөө инструменттери: Мен Xcodeдеги инструменттерди, мисалы Instruments (Allocator, Leaks), колдонуп, чыгуу жерлерин аныктайм.
  4. Жабык циклдерди текшерүү: Мен жабык циклдерди, өзгөчө selfти камтыган учурда, [weak self] же [unowned self] колдонуп, кылдат текшерем.
  5. Хабарламалардан чыгуу: Мен NotificationCenter жана KVO көзөмөлчүлөрүн объекттер жоголгондо чыгарам.
  6. Көзөмөлчүлөрдү жана таймерлерди өчүрүү: Мен аларды ажыратып, invalidate кылып, керек болбой калганда өчүрөм.
  7. Ресурстар менен иштөө: Мен файлдар, сокеттер жана маалымат базалары сыяктуу ресурстарды туура башкаруу, убагында жабуу жана бошотуу.
  8. Кодду кароо: Мен кодду дайыма кароо жүргүзүп, эс тутумду башкаруу маселелерин аныктоого аракет кылам.

Мисал катары [weak self] колдонуу:

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

    func fetchData() {
        // `weak self` колдонуу күчтүү циклдерди алдын алуу үчүн
        DispatchQueue.global().async { [weak self] in
            // Маалымат алуу имитациясы
            sleep(1)

            DispatchQueue.main.async {
                // `self` нөл эмес экенин текшерүү
                self?.completionHandler?()
            }
        }
    }
}

class ViewController {
    var fetcher: DataFetcher?

    func setupFetcher() {
        fetcher = DataFetcher()
        fetcher?.completionHandler = {
            // Мында `self` азыр алсыз болушу мүмкүн, эгер fetcher дагы бар болсо
            print("Data fetched in ViewController")
        }
    }

    deinit {
        print("ViewController жоголду")
    }
}

Мисал катары [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("Деректерди иштетүү: \(data)")
    }

    deinit {
        print("AnotherViewController жоголду")
    }
}