Middle
Swiftda qanday turdagi havolalar mavjud?
sobes.tech AI
AIdan javob
Swiftda uch üç əsas referans növü mövcuddur:
-
**Güclü Referans (Strong Reference):
- Objektdə referans sayğacını artırır.
- Ən az bir güclü referans olduğu müddətcə obyektin dealloc edilməsini qarşısını alır.
- Swift-də standart referans növüdür.
- Güclü referans döngələrinin əsas səbəbidir.
-
**Zəif Referans (Weak Reference):
- Referans sayğacını artırmır.
- Güclü referanslar yoxdursa, obyektin dealloc edilməsinə imkan verir.
weakaçar sözü ilə elan edilir.- Həmişə opsionaldır (
Optional), çünki referans olunan obyektnilola bilər. - Güclü referans döngələrini qarşısını almaq üçün istifadə olunur, bir nümunə digərindən müstəqil olaraq mövcud ola bilər.
class Person { let name: String weak var apartment: Apartment? // Zəif referans init(name: String) { self.name = name } deinit { print("\(name) dealloc edildi") } } class Apartment { let unit: String var tenant: Person? // Normal güclü referans init(unit: String) { self.unit = unit } deinit { print("Mənzil \(unit) dealloc edildi") } } var john: Person? var unit4A: Apartment? john = Person(name: "John Appleseed") unit4A = Apartment(unit: "4A") john!.apartment = unit4A unit4A!.tenant = john // Burada güclü referans döngüsü yaranardı, weak olmasaydı // Referanslar sıfırlanır, obyektlər dealloc edilir john = nil unit4A = nil -
**Müəllifsiz Referans (Unowned Reference):
- Referans sayğacını artırmır.
- Güclü referanslar yoxdursa, obyektin dealloc edilməsinə imkan verir.
unownedaçar sözü ilə elan edilir.- Opsional deyil. Güman edilir ki, referans olunan obyekt, onu ehtiva edən nümunə mövcud olduğu müddətcə həmişə mövcuddur.
- Artıq dealloc edilmiş obyektə
unownedreferans istifadə etmək icra zamanı xəta (crash) ilə nəticələnər. - Güclü referans döngələrini qarşısını almaq üçün istifadə olunur, bir nümunə həmişə digərinin mövcud olduğu müddətcə mövcud olmalıdır və onların
nilolması ehtimalı olmamalıdır (məsələn,selfbağlamalarında).
class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name } deinit { print("\(name) dealloc edildi") } } class CreditCard { let number: UInt64 unowned let customer: Customer // Müəllifsiz referans init(number: UInt64, customer: Customer) { self.number = number self.customer = customer } deinit { print("Karta #\(number) dealloc edildi") } } var john: Customer? = Customer(name: "John Appleseed") john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!) // Əgər müştəri ləğv olunarsa, ona istinad edən kart `unowned` ilə, // etibarsız olacaq, lakin döngü yaranmayacaq. john = nil // Hər iki obyekt dealloc edilir
weak və unowned arasında seçim, obyektlər arasındakı əlaqənin təbiətindən asılıdır: weak istifadə edin, çünki bir obyekt digər olmadan mövcud ola bilər (Person olmadan Apartment), və unowned istifadə edin, çünki bir obyekt həmişə digər mövcud olduqda mövcud olmalıdır (CreditCard həmişə Customer-ə aiddir).