iOS Bellek Yönetimi: ARC ve Retain Cycles Sorunu
# iOS Bellek Yönetimi: ARC ve Retain Cycles Sorunu
iOS'ta belleği otomatik olarak yöneten sisteme ARC (Automatic Reference Counting) denir. Her nesne kaç yerde kullanılıyor, kaç referans var diye sayar. Referans sayısı sıfıra düşünce nesneyi bellekten siler.
Bu sistemi anlamak için basit bir benzetme: Bir kitabı kaç kişi eline alırsa o kadar referans var. Son kişi bırakınca kitap kütüphaneden çıkarılır.
Ancak bir sorun var: İki nesne birbirini tutarsa ne olur? A nesnesi B'yi tutuyor, B de A'yı tutuyor. İkisinin referans sayısı asla sıfıra düşmez. İkisi de bellekte sıkışıp kalır. Buna retain cycle (döngüsel referans) denir.
Hatalı kod:
1class Person {2var name: String3var apartment: Apartment?4init(name: String) { self.name = name }5}67class Apartment {8var number: Int9var tenant: Person?10init(number: Int) { self.number = number }11}1213var john: Person? = Person(name: "John")14var apt: Apartment? = Apartment(number: 101)1516john?.apartment = apt17apt?.tenant = john1819john = nil20apt = nil21// Sorun: İkisi de bellekte kalıyor! Silinmiyor.Çıktı: John ve Apartment nesneleri bellekten çıkmaz, bellek sızıntısı oluşur.
Döngüyü kırmak için bir taraftaki referansı zayıflaştırırız:
1class Apartment {2var number: Int3weak var tenant: Person? // Zayıf referans!4init(number: Int) { self.number = number }5}67var john: Person? = Person(name: "John")8var apt: Apartment? = Apartment(number: 101)910john?.apartment = apt11apt?.tenant = john1213john = nil14apt = nil15// Şimdi ikisi de silinir. Bellek serbest kalır.16[/cod]1718**Çıktı:** Her iki nesne de başarıyla bellekten çıkar.1920- **`weak`:** Referans `nil` olabilirse (opsiyonel). Çoğu durumda bunu kullan.21- **`unowned`:** Referans asla `nil` olmayacaksa. Ama hatalı kullanırsan crash olur.2223Eğer emin değilsen `weak` kullan.2425Kapaış (closure) içinde `self` kullanırsan retain cycle oluşabilir:2627[kod]28let closure = { [weak self] in29print(self?.name)30}`[weak self]` capture list'i döngüyü kırar.
ARC harika ama retain cycle'lar tuzak. İki nesne birbirini tutarsa, birini `weak` yap. Closure'larda `[weak self]` kullan. Böyle bellek sızdırmazsın.
0 yorum