Sobes.tech
Middle

Swiftте кайсы түрдөгү шилтемелер бар?

sobes.tech AI

AIден жооп

Swiftте үч негизги шилтемелер түрү бар:

  1. Күчтүү шилтеме (Strong Reference):

    • Объекттин шилтемелер санын көбөйтөт.
    • Анын эркин бошотулушун алдын алат, эгер кеминде бир күчтүү шилтеме болсо.
    • Swiftте стандарттык шилтеме түрү.
    • Дөңгөлөк шилтемелерге алып келиши мүмкүн.
  2. **Слаб шилтеме (Weak Reference):

    • Шилтемелер санын көбөйтпөйт.
    • Объекттин эркин бошотулушун камсыздайт, эгер башка күчтүү шилтемелер жок болсо.
    • weak сөзү менен белгиленет.
    • Ар дайым опционал (Optional), анткени шилтемеленген объект nil болушу мүмкүн.
    • Дөңгөлөк шилтемелердин алдын алуу үчүн колдонулат.
    class Person {
        let name: String
        weak var apartment: Apartment? // Слаб шилтеме
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) бошотулду") }
    }
    
    class Apartment {
        let unit: String
        var tenant: Person? // Адаттагы күчтүү шилтеме
        init(unit: String) {
            self.unit = unit
        }
        deinit { print("Квартира \(unit) бошотулду") }
    }
    
    var john: Person?
    var unit4A: Apartment?
    
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")
    
    john!.apartment = unit4A
    unit4A!.tenant = john // Бул жерде цикл түзүлүшү мүмкүн, эгер `weak` колдонулбаса
    
    // шилтемелер нөлгө коюлуп, объекттер бошотулат
    john = nil
    unit4A = nil
    
  3. Unowned шилтеме (Менчиктеги эмес шилтеме):

    • Шилтемелер санын көбөйтпөйт.
    • Объекттин эркин бошотулушун камсыздайт, эгер башка күчтүү шилтемелер жок болсо.
    • unowned сөзү менен белгиленет.
    • Опционал эмес. Көрсөтүлүп жаткан объект ар дайым бар деп эсептелет, ал эми аны камтыган экземпляр дагы бар болсо.
    • Башкача айтканда, unowned шилтемеси аркылуу бошотулган объектке кирүү ишке ашпайт жана ката чыгарат.
    • Бул шилтемелердин циклин алдын алуу үчүн колдонулат, эгер бир объект ар дайым башка объекттин ичинде болушу керек болсо жана nil болуу мүмкүнчүлүгү жок болсо.
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) бошотулду") }
    }
    
    class CreditCard {
        let number: UInt64
        unowned let customer: Customer // Менчиктеги эмес шилтеме
        init(number: UInt64, customer: Customer) {
            self.number = number
            self.customer = customer
        }
        deinit { print("Кредиттик карта #\(number) бошотулду") }
    }
    
    var john: Customer? = Customer(name: "John Appleseed")
    john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Эгер кардар жок кылынса, ага шилтемелеген карта да иштебей калат, бирок цикл түзүлбөйт
    john = nil // Эки объект да бошотулат
    

weak жана unowned арасындагы тандоо объекттердин ортосундагы мамилеге көз каранды: weak колдонуу керек, эгер бир объект башкасыз да болушу мүмкүн (Person жана Apartment), жана unowned колдонуу керек, эгер бир объект башкасы жок болсо да, ар дайым болушу керек (CreditCard ар дайым Customerке тиешелүү).