Sobes.tech
Middle

iOS'ta retain cycle (bellek döngüsü) oluşumunu nasıl önleyebilirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

İşaretleri tutma döngüleri, zayıf (weak) veya koşulsuz (unowned) referansların doğru kullanımıyla önlenir.

Zayıf referanslar (weak):

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

Koşulsuz unowned referanslar (unowned):

  • Nesnenin referans sayacını artırmazlar.
  • Kesinlikle boş 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.