- Published on
Swift-da weak self
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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)")
}
| Holat | Kuchli referens bilan | weak self bilan |
|---|---|---|
| Ekranlar orasida 10 marta u-bu | Count: 10 va o'sib boradi | Count: 1 da qoladi |
| De-initialize chaqirilishimi? | Yo'q (500s tugamaguncha) | Ha (orqaga bosilganda) |
| Xotiradagi ViewModel soni | Ko'payib boradi | Har 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
selfga 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'ngselfoptional bo'ladi —self?.yokiguard let selfkerak- Tarmoqdan ma'lumot yuklovchi, kechiktirilgan amallar bajaruvchi barcha asinxron vazifalarda
weak selfishlatish tavsiya etiladi
Keyingi videolarda tarmoqdan ma'lumot yuklashda weak self amalda ko'rsatiladi.