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:
-
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.
-
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.
weakaçar sözü ilə elan edilir.- Həmişə opsionaldır (
Optional), çünki referans verilən obyektnilola 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 -
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.
unownedaç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ə
unownedreferans 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ə
nilola 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
weak və unowned 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 (Person və Apartment), və unowned istifadə edin, əgər obyekt digərindən həmişə mövcud olmalıdır (CreditCard və Customer).