Sobes.tech
Middle

Swiftda qanday turdagi havolalar mavjud?

sobes.tech AI

AIdan javob

Swiftda uch üç əsas referans növü mövcuddur:

  1. **Güclü Referans (Strong Reference):

    • Objektdə referans sayğacını artırır.
    • Ən az bir güclü referans olduğu müddətcə obyektin dealloc edilməsini qarşısını alır.
    • Swift-də standart referans növüdür.
    • Güclü referans döngələrinin əsas səbəbidir.
  2. **Zəif Referans (Weak Reference):

    • Referans sayğacını artırmır.
    • Güclü referanslar yoxdursa, obyektin dealloc edilməsinə imkan verir.
    • weak açar sözü ilə elan edilir.
    • Həmişə opsionaldır (Optional), çünki referans olunan obyekt nil ola bilər.
    • Güclü referans döngələrini qarşısını almaq üçün istifadə olunur, bir nümunə digərindən müstəqil olaraq mövcud ola bilər.
    class Person {
        let name: String
        weak var apartment: Apartment? // Zəif referans
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) dealloc edildi") }
    }
    
    class Apartment {
        let unit: String
        var tenant: Person? // Normal güclü referans
        init(unit: String) {
            self.unit = unit
        }
        deinit { print("Mənzil \(unit) dealloc edildi") }
    }
    
    var john: Person?
    var unit4A: Apartment?
    
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")
    
    john!.apartment = unit4A
    unit4A!.tenant = john // Burada güclü referans döngüsü yaranardı, weak olmasaydı
    
    // Referanslar sıfırlanır, obyektlər dealloc edilir
    john = nil
    unit4A = nil
    
  3. **Müəllifsiz Referans (Unowned Reference):

    • Referans sayğacını artırmır.
    • Güclü referanslar yoxdursa, obyektin dealloc edilməsinə imkan verir.
    • unowned açar sözü ilə elan edilir.
    • Opsional deyil. Güman edilir ki, referans olunan obyekt, onu ehtiva edən nümunə mövcud olduğu müddətcə həmişə mövcuddur.
    • Artıq dealloc edilmiş obyektə unowned referans istifadə etmək icra zamanı xəta (crash) ilə nəticələnər.
    • Güclü referans döngələrini qarşısını almaq üçün istifadə olunur, bir nümunə həmişə digərinin mövcud olduğu müddətcə mövcud olmalıdır və onların nil olması ehtimalı olmamalıdır (məsələn, self bağlamalarında).
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) dealloc edildi") }
    }
    
    class CreditCard {
        let number: UInt64
        unowned let customer: Customer // Müəllifsiz referans
        init(number: UInt64, customer: Customer) {
            self.number = number
            self.customer = customer
        }
        deinit { print("Karta #\(number) dealloc edildi") }
    }
    
    var john: Customer? = Customer(name: "John Appleseed")
    john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Əgər müştəri ləğv olunarsa, ona istinad edən kart `unowned` ilə,
    // etibarsız olacaq, lakin döngü yaranmayacaq.
    john = nil // Hər iki obyekt dealloc edilir
    

weakunowned arasında seçim, obyektlər arasındakı əlaqənin təbiətindən asılıdır: weak istifadə edin, çünki bir obyekt digər olmadan mövcud ola bilər (Person olmadan Apartment), və unowned istifadə edin, çünki bir obyekt həmişə digər mövcud olduqda mövcud olmalıdır (CreditCard həmişə Customer-ə aiddir).