- 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.