Middle
Swiftте кайсы түрдөгү шилтемелер бар?
sobes.tech AI
AIден жооп
Swiftте үч негизги шилтемелер түрү бар:
-
Күчтүү шилтеме (Strong Reference):
- Объекттин шилтемелер санын көбөйтөт.
- Анын эркин бошотулушун алдын алат, эгер кеминде бир күчтүү шилтеме болсо.
- Swiftте стандарттык шилтеме түрү.
- Дөңгөлөк шилтемелерге алып келиши мүмкүн.
-
**Слаб шилтеме (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 -
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ке тиешелүү).