Sobes.tech
Middle

iOS-də retention cycle (saxlama döngüsü) yaranmasının qarşısını necə almaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

Yadda saxlama dövrlərini qarşısını almaq üçün zəif (weak) və ya şərtsiz (unowned) referansların düzgün istifadəsi vacibdir.

Zəif referanslar (weak):

  • Obrazın referans sayğacını artırmır.
  • nil ola bilər (nullable).
  • Bir obyekt digərindən müstəqil olaraq mövcud ola bilər (məsələn, nümayəndəçi).
class DelegateExample {
    weak var delegate: SomeDelegateType? // Zəif referans nümayəndəçiyə
}

Şərtsiz unowned referanslar (unowned):

  • Obrazın referans sayğacını artırmır.
  • Qətiyyən nil deyil (non-nil).
  • Bir obyekt açıq şəkildə başqa birinə sahibdirsə və asılı obyekt yalnız sahibi ilə birlikdə mövcuddursa istifadə olunur (məsələn, self-i tutan bağlamalar, sinifdə, bağlama açıq şəkildə sinif nümunəsinə aiddir). unowned referansına girişdə, əgər obyekt artıq sərbəst buraxılıbsa, icra zamanı xəta baş verir.
class Owner {
    var closure: (() -> Void)?

    func setupClosure() {
        closure = { [unowned self] in // Şərtsiz `unowned` referans self
            // self istifadə
            print("Unowned self istifadə")
        }
    }
}

Bağlamalarda istifadə: Bağlamalar, sinif nümunələrini güclü referansla tutarlarsa, saxlama dövrləri yarada bilərlər və bu sinif nümunəsi də bağlamaya güclü referansdır. Bunu qarşısını almaq üçün, bağlamanın əvvəlində tutma siyahıları (capture lists) istifadə olunur:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = { [weak self] in // Zəif referans self
        guard let strongSelf = self else {
            return "" // self artıq nil olduqda
        }
        if let text = strongSelf.text {
            return "<\(strongSelf.name)>\(text)</\(strongSelf.name)>"
        } else {
            return "<\(strongSelf.name)/>"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) sərbəst buraxılır")
    }
}

weakunowned seçimi, obyektlər arasındakı münasibətlərin semantikasına bağlıdır:

  • weak: referans, obyektin həyat dövrü boyunca nil ola bilər.
  • unowned: referans, obyekt daha uzun və ya eyni müddətdə mövcuddursa və heç vaxt nil olmayacaqsa istifadə olunur.