Sobes.tech
Middle

iOSda retention cycle (saqlash sikli) yuzaga kelishini qanday oldini olish mumkin?

sobes.tech AI

AIdan javob

Retenční döngüleri önlemek için zayıf (weak) veya koşulsuz (unowned) referansların doğru kullanımı gereklidir.

Zayıf referanslar (weak):

  • Nesnenin referans sayacını artırmazlar.
  • nil olabilirler (nullable).
  • Bir nesne, başka bir nesneden bağımsız olarak var olabilir (örneğin, delege).
class DelegateExample {
    weak var delegate: SomeDelegateType? // Zayıf referans delege
}

Koşulsuz unowned referanslar (unowned):

  • Nesnenin referans sayacını artırmazlar.
  • Kesinlikle nil olmayan (non-nil) olurlar.
  • Bir nesne açıkça başka bir nesneye sahip olduğunda ve bağımlı nesne yalnızca sahip ile birlikte var olabiliyorsa kullanılırlar (örneğin, self'i yakalayan kapanışlar, sınıfta, kapanış açıkça sınıf örneğine ait). unowned referansa erişirken, nesne zaten serbest bırakılmışsa, çalışma zamanı hatası oluşur.
class Owner {
    var closure: (() -> Void)?

    func setupClosure() {
        closure = { [unowned self] in // Koşulsuz `unowned` referans self
            // self kullanımı
            print("Unowned self kullanımı")
        }
    }
}

Kapanışlarda kullanımı: Kapanışlar, sınıf örneklerini güçlü referansla yakalarlarsa, tutma döngüleri oluşturabilirler ve bu sınıf örneği de kapanışı güçlü referansla içerir. Bunu önlemek için, kapanışın başında yakalama listeleri (capture lists) kullanılır:

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

    lazy var asHTML: () -> String = { [weak self] in // Zayıf referans self
        guard let strongSelf = self else {
            return "" // self zaten nil ise durumunu yönet
        }
        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) yok ediliyor")
    }
}

weak ve unowned arasındaki seçim, nesneler arasındaki ilişkilerin semantiğine bağlıdır:

  • weak: referans, nesnenin yaşam döngüsü boyunca nil olma olasılığı varsa.
  • unowned: referans, referans alan nesneden daha uzun veya eşit süreyle var oluyorsa ve asla nil olmayacaksa kullanılır.