ARC (Otomatik Referans Sayımı) — Swift'te hafıza yönetimi için otomatik bir sistemdir. Bir nesneye her yeni güçlü referans eklendiğinde sayacı artırır; silindiğinde azaltır. Sayaç sıfıra ulaştığında — nesne serbest bırakılır.
Retain cycle (tutma döngüsü) — nesnelerin birbirlerine güçlü referanslarla bağlandığı ve asla serbest bırakılmadığı bir durumdur.
Kaçınma Yöntemleri:
protocol SomeDelegate: AnyObject { } class Owner { weak var delegate: SomeDelegate? }
[weak self] veya [unowned self] kullanın:class Example { var closure: (() -> Void)? func setup() { closure = { [weak self] in self?.doSomething() } } func doSomething() { } }
Kapatma içindeki [weak self] ve [unowned self] arasındaki fark nedir? Hangi referans tipini ne zaman kullanmalıyız?
Cevap:
[weak self] opsiyonel bir referans oluşturur; self nil olabilir, bu nedenle genellikle güvenli bir şekilde self? kullanılır.[unowned self] opsiyonel olmayan bir referans oluşturur ve sayacı ARTIRMAZ; eğer nesne zaten serbest bırakıldıysa ve bir referans varsa — çökme meydana gelir.[unowned self] kullanılabilir.Örnek:
someClosure = { [weak self] in self?.doTask() } // veya (eğer self %100 kapatma süresinden daha uzun yaşarsa): someClosure = { [unowned self] in doTask() }
Hikaye
Projede, ViewController ile onun tıklama işleme bağlı closure arasında bir retain cycle durumu oluştu. ViewController closure'a güçlü bir referansla tutunuyordu. Sonuç olarak, kontrolör ve tüm verileri ekran kapatıldığında serbest bırakılmadı. Sorun, closure'da
[weak self]kullanarak çözüldü.
Hikaye
İki nesne arasında delegate deseni uygulaması. Delegate güçlü (
strong) bir özellik olarak ilan edildi. Sonuç olarak, temel nesneyi bellekten silmeye çalıştığınızda, belirli bir nesne serbest bırakılmadı, bu da bellek sızıntısına yol açtı. Delegate'i weak olan hale geçirince sorun çözüldü.
Hikaye
UIView içinde bir kapatma kullanılarak animasyon yapıldı. Kapatma,
[unowned self]ile self’i tutuyordu. Görünüm animasyon tamamlanmadan silindiğinde, uygulama zaten serbest bırakılmış self’e eriştiği için çöküyordu. Çözüm —[weak self]kullanmak ve kapatma içinde non-nil self kontrolü yapmaktı.