Sobes.tech
Middle

Swift-də hansı növ istinadlar mövcuddur?

sobes.tech Süni İntellekt

AI-dan cavab

Swift-də üç əsas növ əlaqə mövcuddur:

  1. Güclü Əlaqə (Strong Reference):

    • Nümunənin referans sayğacını artırır.
    • Əgər ən azı bir güclü əlaqə mövcuddursa, obyektin sərbəst buraxılmasını qarşısını alır.
    • Swift-də standart əlaqə növüdür.
    • Güclü əlaqələrin dövr etməsinə səbəb olur.
  2. Zəif Əlaqə (Weak Reference):

    • Referans sayğacını artırmır.
    • Əgər ona güclü əlaqə yoxdursa, obyekt sərbəst buraxılır.
    • weak açar sözü ilə elan edilir.
    • Həmişə opsionaldır (Optional), çünki referans verilən obyekt nil ola bilər.
    • Güclü əlaqələrin dövr etməsinin qarşısını almaq üçün istifadə olunur.
    class Person {
        let name: String
        weak var apartment: Apartment? // Zəif əlaqə
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) sərbəst buraxıldı") }
    }
    
    class Apartment {
        let unit: String
        var tenant: Person? // Güclü əlaqə
        init(unit: String) {
            self.unit = unit
        }
        deinit { print("Mənzil \(unit) sərbəst buraxıldı") }
    }
    
    var john: Person?
    var unit4A: Apartment?
    
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")
    
    john!.apartment = unit4A
    unit4A!.tenant = john // Burada güclü əlaqələr dövr edə bilərdi, zəif ilə qarşısını alırıq
    
    // Əlaqələr sıfırlanır, obyektlər sərbəst buraxılır
    john = nil
    unit4A = nil
    
  3. Müəllifsiz Əlaqə (Unowned Reference):

    • Referans sayğacını artırmır.
    • Əgər ona güclü əlaqə yoxdursa, obyekt sərbəst buraxılır.
    • unowned açar sözü ilə elan edilir.
    • Həmişə opsional deyil. Güman edilir ki, referans verilən obyekt həmişə mövcuddur, obyekt sərbəst buraxılsa belə.
    • Sərbəst buraxılmış obyektə unowned referans ilə müraciət etmək zamanında səhv (crash) baş verər.
    • Güclü əlaqələrin dövr etməsinin qarşısını almaq üçün istifadə olunur, xüsusən bir obyekt digərinin həmişə mövcud olduğu halda və nil ola bilmədiyi zaman (məsələn, self-ə bağlama daxilində).
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) sərbəst buraxıldı") }
    }
    
    class CreditCard {
        let number: UInt64
        unowned let customer: Customer // Müəllifsiz əlaqə
        init(number: UInt64, customer: Customer) {
            self.number = number
            self.customer = customer
        }
        deinit { print("Kredit kartı #\(number) sərbəst buraxıldı") }
    }
    
    var john: Customer? = Customer(name: "John Appleseed")
    john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Əgər müştəri silinsə, ona bağlı kredit kartı da sərbəst buraxılır, dövr yaranmaz
    john = nil // Hər iki obyekt sərbəst buraxılır
    

weakunowned arasında seçim əlaqələr arasındakı xarakterə bağlıdır: weak istifadə edin, əgər obyekt digərindən asılı olmayaraq mövcud ola bilər (PersonApartment), və unowned istifadə edin, əgər obyekt digərindən həmişə mövcud olmalıdır (CreditCardCustomer).