Sobes.tech
Middle

Swift'te hangi tür bağlantılar vardır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Swift'te sınıf örneklerine referansların üç temel türü vardır:

  1. Güçlü Referans (Strong Reference):

    • Varsayılan referans türüdür.
    • Güçlü referans, nesnenin referans sayacını artırır.
    • Nesne, en az bir güçlü referans kaldığı sürece bellekten serbest bırakılmaz.
    • Güçlü referans döngüleri (strong reference cycles) nedeniyle bellek sızıntılarının ana nedenidir.
    class Person {
        let name: String
        init(name: String) { self.name = name }
        deinit { print("\(name) yok ediliyor") }
    }
    
    var reference1: Person? = Person(name: "John")
    // reference1 artık güçlü referans, Person'ın referans sayacı artar
    
  2. Zayıf Referans (Weak Reference):

    • weak anahtar kelimesi kullanılarak bildirilir.
    • Zayıf referans, nesnenin referans sayacını artırmaz.
    • strong reference cycles önlemek için kullanılır.
    • Her zaman opsiyoneldir (Optional), çünkü zayıf referans gösterdiği nesne herhangi bir zamanda yok edilebilir. Nesne yok edildiğinde, zayıf referans otomatik olarak nil olur.
    class Apartment {
        let unit: String
        weak var tenant: Person? // Zayıf referans
        init(unit: String) { self.unit = unit }
        deinit { print("Daire \(unit) yok ediliyor") }
    }
    
    var john: Person? = Person(name: "John")
    var unit4A: Apartment? = Apartment(unit: "4A")
    
    john?.apartment = unit4A // Eğer Apartment, Person'a güçlü referans olsaydı
    unit4A?.tenant = john   // Zayıf referans
    
    // Güçlü referanslar kaldırıldıktan sonra nesneler yok edilir
    john = nil
    unit4A = nil
    // Çıktı: "John yok ediliyor", "Daire 4A yok ediliyor"
    // Eğer tenant güçlü referans olsaydı, bellek sızıntısı (döngü) olurdu
    
  3. İlgisiz Referans (Unowned Reference):

    • unowned anahtar kelimesi kullanılarak bildirilir.
    • weak referansa benzer şekilde, nesnenin referans sayacını artırmaz.
    • Ayrıca strong reference cycles önlemek için kullanılır.
    • weak'ten farkı, opsiyonel değildir (Optional) ve referansın gösterdiği nesnenin, referansın yaşam süresi boyunca var olacağı varsayılır.
    • unowned referans gösterdiği nesne yok edilirse ve erişilmeye çalışılırsa, çalışma zamanı hatası (runtime error) oluşur.
    • Bir nesne her zaman var olursa ve başka bir nesne onunla ilişkili ise, örneğin "ebeveyn-çocuk" durumu gibi, ebeveyn çocuğu sahiplenir ama çocuk ebeveyni güçlü şekilde sahiplenmez.
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) { self.name = name }
        deinit { print("\(name) yok ediliyor") }
    }
    
    class CreditCard {
        let number: Int
        unowned let customer: Customer // İlgisiz referans
    
        init(number: Int, customer: Customer) {
            self.number = number
            self.customer = customer // init sırasında güvenli atama
        }
        deinit { print("Kart #\(number) yok ediliyor") }
    }
    
    var john: Customer? = Customer(name: "John Doe")
    john?.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Güçlü referans kaldırılıyor
    john = nil
    // Çıktı: "John Doe yok ediliyor", "Kart #1234567890123456 yok ediliyor"
    // CreditCard'daki ilgisiz referans, customer var olduğu sürece geçerlidir.
    // Eğer CreditCard, Customer'dan daha uzun yaşarsa ve customer'a ilgisiz referansla erişilmeye çalışılırsa, hata oluşur.
    

weak ve unowned arasındaki temel fark:

  • weak: nesne nil olabilir. Nesnelerin yaşam süresi birbirine sıkı sıkıya bağlı değilse kullanılır (biri diğer olmadan da var olabilir).
  • unowned: nesne nil olamaz, ve en azından referansın yaşam süresi boyunca var olacağına güvenilir. Kullanılır, nesne en azından referansın yaşam süresi boyunca var olacaksa.