Published on

Swift-da weak self

Authors

Bu video Avtomatik Referens Sanash (ARC), kuchli va zaif referenslar hamda weak self nima uchun ishlatilishi haqida.


ARC β€” Avtomatik Referens Sanash

Swift xotirani ARC (Automatic Reference Counting) orqali boshqaradi. Har bir ob'ekt yaratilganda tizim unga referens saqlaydi. Ob'ekt kerak bo'lmaganda (referens soni nolga tushganda) u xotiradan o'chiriladi (de-initialize).

Foydalanuvchi ikkinchi ekranga o'tib, orqaga qaytganda β€” ikkinchi ekran de-initialize bo'lishi kerak. Shu yo'l bilan xotira bo'shatiladi va ilova samarali ishlaydi.


Muammo β€” kuchli referens (strong reference)

Asinxron vazifa ichida self ishlatilganda, Swift avtomatik ravishda kuchli referens yaratadi. Bu tizimga "bu sinf topshiriq tugamaguncha yashab turishi shart" deydi.

class WeakSelfSecondScreenViewModel: ObservableObject {
    @Published var data: String? = nil

    init() {
        print("Initialize")
        getData()
    }

    deinit {
        print("De-initialize")
    }

    func getData() {
        // Kuchli referens β€” muammo
        DispatchQueue.main.asyncAfter(deadline: .now() + 500) {
            self.data = "Yangi ma'lumot"  // ← kuchli referens
        }
    }
}

Bu holda foydalanuvchi 500 soniya ichida orqaga qaytib, oldinga borib, yana orqaga ketsa β€” har gal yangi ViewModel yaratiladi, lekin eskisi de-initialize bo'lmaydi. Chunki self ga kuchli referens bor, vazifa tugamaguncha sinf xotirada saqlanadi.

Natija: foydalanuvchi ekranlar orasida bir necha marta u-bu qilsa, xotirada ko'plab keraksiz ViewModel-lar to'planib qoladi.


Yechim β€” zaif referens (weak self)

[weak self] yordamida kuchli referens zaifga (optional) aylantiriladi. Bu tizimga "bu sinf kerak bo'lmasa o'chirib tashlasa ham bo'ladi" deydi.

func getData() {
    // Zaif referens β€” to'g'ri yechim
    DispatchQueue.main.asyncAfter(deadline: .now() + 500) { [weak self] in
        self?.data = "Yangi ma'lumot"  // ← zaif referens, self endi optional
    }
}

[weak self] qo'shilganda self optional bo'lib qoladi β€” shuning uchun self. o'rniga self?. yoziladi.

Natija: foydalanuvchi orqaga qaytganda ViewModel de-initialize bo'ladi. Asinxron vazifa hali ham ishlayotgan bo'lsa, u tugatilganda self allaqachon yo'q bo'lishi mumkin β€” lekin bu muammo emas, chunki foydalanuvchi o'sha ekranda emas.


Isbotlash β€” UserDefaults bilan hisoblagich

Kuchli va zaif referens farqini ko'rish uchun sodda hisoblagich:

// ViewModel-da
init() {
    let currentCount = UserDefaults.standard.integer(forKey: "count")
    UserDefaults.standard.set(currentCount + 1, forKey: "count")
    print("Initialize β€” count: \(currentCount + 1)")
}

deinit {
    let currentCount = UserDefaults.standard.integer(forKey: "count")
    UserDefaults.standard.set(currentCount - 1, forKey: "count")
    print("De-initialize β€” count: \(currentCount - 1)")
}
HolatKuchli referens bilanweak self bilan
Ekranlar orasida 10 marta u-buCount: 10 va o'sib boradiCount: 1 da qoladi
De-initialize chaqirilishimi?Yo'q (500s tugamaguncha)Ha (orqaga bosilganda)
Xotiradagi ViewModel soniKo'payib boradiHar doim 1 ta

Sintaksis

// Kuchli referens (standart)
DispatchQueue.global().async {
    self.data = "yangi"     // self majburiy
}

// Zaif referens
DispatchQueue.global().async { [weak self] in
    self?.data = "yangi"    // self optional
}

// guard let bilan β€” self nil bo'lsa chiqib ketadi
DispatchQueue.global().async { [weak self] in
    guard let self = self else { return }
    self.data = "yangi"     // endi optional emas
}

Qachon weak self ishlatish kerak?

Ishlatish kerak:

  • Asinxron vazifalar (tarmoqdan ma'lumot yuklanishi, kechiktirilgan vazifalar)
  • Closure ichida self ga murojaat bo'lganda va shu closure sinf xotirada saqlanishi mumkin bo'lsa

Shart emas:

  • Sinxron, tezkor kod
  • View-lar (struct) β€” ular sinf emas, referens muammosi yo'q
  • Vazifa juda qisqa bo'lsa va sinf de-initialize bo'lish xavfi bo'lmasa

Xulosa

Bu videoda o'rganildi:

  • ARC β€” Swift xotirani referens soni orqali boshqaradi
  • Kuchli referens β€” self. standart holat, sinf vazifa tugamaguncha yashab turadi
  • Zaif referens β€” [weak self] bilan, sinf kerak bo'lmasa o'chib ketishi mumkin
  • Kuchli referens bilan asinxron vazifalar xotirada ko'plab keraksiz ob'ektlar to'planishiga olib keladi
  • [weak self] dan so'ng self optional bo'ladi β€” self?. yoki guard let self kerak
  • Tarmoqdan ma'lumot yuklovchi, kechiktirilgan amallar bajaruvchi barcha asinxron vazifalarda weak self ishlatish tavsiya etiladi

Keyingi videolarda tarmoqdan ma'lumot yuklashda weak self amalda ko'rsatiladi.

Buy mea coffee