Sobes.tech
Middle

Loyihalaringizda xotira oqib ketishini qanday oldini olasiz?

sobes.tech AI

AIdan javob

Men bir nechta yondashuvlardan foydalanaman:

  1. ARC (Avtomatik Referenslar Hisobi): Bu Swift va Objective-C da asosiy xotira boshqarish mexanizmi. U ob'ektlarga bo'lgan referenslarni avtomatik ravishda hisoblaydi va referenslar soni nolga teng bo'lsa, ularni bo'shatadi.
  2. Kuchli referens aylanishlaridan qochish: Bu eng keng tarqalgan xotira oqibati sababidir. Men weak yoki unowned referenslardan foydalanaman, aylanishlarni buzish uchun. Bu odatda delegatlar va yopilishlar bilan ishlashda yuzaga keladi.
  3. Profiling vositalari: Men Xcode ning Instruments (Allocator, Leaks) kabi vositalaridan muntazam foydalanaman, oqibalarni aniqlash uchun.
  4. Yopilishlarni tekshirish: Men yopilishlarni ehtiyotkorlik bilan tekshiraman, ayniqsa self ni ushlab qolishda, [weak self] yoki [unowned self] yozuvlaridan foydalanib.
  5. Bildirishnomalardan chiqish: Men NotificationCenter va KVO kuzatuvchilaridan ob'ektlar yo'q qilinayotganda chiqaman.
  6. Kuzatuvchilar va vaqtinchalik taymerlarni olib tashlash: Men invalid bo'lgan taymerlarni o'chiraman va ularni nullga o'rnataman, shuningdek, kerak bo'lmagan kuzatuvchilarni olib tashlayman.
  7. Resurslarni boshqarish: Men fayllar, soketlar va ma'lumotlar bazalari kabi resurslarni to'g'ri boshqaraman, ularni vaqtida yopib va bo'shataman.
  8. Kodlarni ko'rib chiqish: Men muntazam ravishda kodlarni ko'rib chiqaman, jumladan, xotira boshqarish bilan bog'liq muammolarni aniqlash uchun.

[weak self] dan foydalanish misoli:

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

    func fetchData() {
        // Kuchli aylanishni oldini olish uchun weak self dan foydalanish
        DispatchQueue.global().async { [weak self] in
            // Ma'lumotlarni olishni simulyatsiya qilish
            sleep(1)

            DispatchQueue.main.async {
                // self ni nil emasligini tekshirish
                self?.completionHandler?()
            }
        }
    }
}

class ViewController {
    var fetcher: DataFetcher?

    func setupFetcher() {
        fetcher = DataFetcher()
        fetcher?.completionHandler = {
            // Bu yerda, agar fetcher hali mavjud bo'lsa, self endi zaif bo'lishi mumkin
            print("Ma'lumotlar ViewController da olindi")
        }
    }

    deinit {
        print("ViewController yo'q qilindi")
    }
}

weak dan foydalanish delegat uchun misol:

protocol DataProcessorDelegate: AnyObject { // AnyObject referens turini ta'minlaydi va kuchli aylanishlarni oldini oladi
    func processData(_ data: String)
}

class DataProcessor {
    weak var delegate: DataProcessorDelegate? // weak dan foydalanish

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

class AnotherViewController: DataProcessorDelegate {
    let processor = DataProcessor()

    init() {
        processor.delegate = self
    }

    func processData(_ data: String) {
        print("Ma'lumotlarni ishlash: \(data)")
    }

    deinit {
        print("AnotherViewController yo'q qilindi")
    }
}