ProgramlamaiOS geliştirici

Swift'te ARC nedir? Kapatmalar ve delegelerle çalışırken retain cycle nasıl önlenir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Delegasyon nesneleri için zayıf referans kullanın:
protocol SomeDelegate: AnyObject { } class Owner { weak var delegate: SomeDelegate? }
  • Kapatmalar için [weak self] veya [unowned self] kullanın:
class Example { var closure: (() -> Void)? func setup() { closure = { [weak self] in self?.doSomething() } } func doSomething() { } }

Altyazılı Soru.

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.
  • Seçim, iş mantığına bağlıdır: eğer kapatma kesinlikle self'tan daha uzun yaşamıyorsa, [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() }

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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