Sobes.tech
Middle

Swift-də hansı növ bağlantılar mövcuddur?

sobes.tech Süni İntellekt

AI-dan cavab

Swift-də sinif nümunələrinə üç əsas referans növü mövcuddur:

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

    • Bu, standart referans növüdür.
    • Güclü referans obyektin referans sayğacını artırır.
    • Obyekt, ən azı bir güclü referans olduğu müddətcə yaddaşdan azad olunmayacaq.
    • Döngüvi güclü referanslar (strong reference cycles) zamanı yaddaş sızmasının əsas səbəbi.
    class Person {
        let name: String
        init(name: String) { self.name = name }
        deinit { print("\(name) azad edilir") }
    }
    
    var reference1: Person? = Person(name: "John")
    // reference1 indi güclü referansdır, Person-in referans sayğacı artır
    
  2. Zəif Referans (Weak Reference):

    • weak açar sözü ilə elan edilir.
    • Zəif referans obyektin referans sayğacını artırmır.
    • strong reference cycles-ləri qarşısını almaq üçün istifadə olunur.
    • Hər zaman seçimlidir (Optional), çünki zəif referans göstərdiyi obyekt hər zaman deaktivləşdirilə bilər. Deaktivləşdirildikdə, zəif referans avtomatik nil olur.
    class Apartment {
        let unit: String
        weak var tenant: Person? // Zəif referans
        init(unit: String) { self.unit = unit }
        deinit { print("Mənzil \(unit) azad edilir") }
    }
    
    var john: Person? = Person(name: "John")
    var unit4A: Apartment? = Apartment(unit: "4A")
    
    john?.apartment = unit4A // Əgər Apartment güclü referans olsaydı
    unit4A?.tenant = john   // Zəif referans
    
    // Güclü referanslar silindikdən sonra obyektlər deaktivləşdiriləcək
    john = nil
    unit4A = nil
    // Nəticə: "John azad edilir", "Mənzil 4A azad edilir"
    // Əgər tenant güclü referans olsaydı, yaddaş sızması baş verərdi (strong cycle)
    
  3. Qeyri-müəyyən Referans (Unowned Reference):

    • unowned açar sözü ilə elan edilir.
    • weak referans kimi, obyektin referans sayğacını artırmır.
    • strong reference cycles-ləri qarşısını almaq üçün istifadə olunur.
    • weak-dən fərqli olaraq, seçimli deyil (Optional) və güman edir ki, göstərilən obyekt bütün "həyat müddəti" ərzində mövcud olacaq.
    • Əgər unowned referans göstərdiyi obyekt deaktivləşərsə, icra zamanı xəta baş verər (runtime error).
    • Bu, bir obyektin həmişə mövcud olduğu vəziyyətlər üçün uyğundur, digər obyekt isə mövcud olduqda (məsələn, "valideyn-uşaq" münasibəti, burada valideyn uşağı idarə edir, amma uşaq valideyni güclü idarə etmir).
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) { self.name = name }
        deinit { print("\(name) azad edilir") }
    }
    
    class CreditCard {
        let number: Int
        unowned let customer: Customer // Qeyri-müəyyən referans
    
        init(number: Int, customer: Customer) {
            self.number = number
            self.customer = customer // init-də qeyri-müəyyən referansın təyin edilməsi təhlükəsizdir
        }
        deinit { print("Karta #\(number) azad edilir") }
    }
    
    var john: Customer? = Customer(name: "John Doe")
    john?.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Güclü referansı silmək
    john = nil
    // Nəticə: "John Doe azad edilir", "Karta #1234567890123456 azad edilir"
    // CreditCard-dəki qeyri-müəyyən referans, customer mövcud olduğu müddətcə etibarlı idi.
    // Əgər CreditCard daha uzun ömürlü olsaydı və biz customer-ə qeyri-müəyyən referans vasitəsilə müraciət etsəydik, xəta baş verərdi.
    

weakunowned arasındakı əsas fərq:

  • weak: obyekt nil ola bilər. Bu, obyektlərin həyat dövrünün sərt şəkildə bağlı olmadığı hallarda istifadə olunur (birinin digər olmadan mövcud ola bilməsi).
  • unowned: obyekt nil ola bilməz, və ya nil olarsa, proqram xətası baş verər. Bu, referans olunan obyektin, referans edən obyekt mövcud olduğu müddətcə mövcud olacağına əminsinizsə istifadə olunur.