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:
-
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 -
Zəif Referans (Weak Reference):
weakaç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 avtomatiknilolur.
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) -
Qeyri-müəyyən Referans (Unowned Reference):
unownedaçar sözü ilə elan edilir.weakreferans 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
unownedreferans 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.
weak və unowned arasındakı əsas fərq:
weak: obyektnilola 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: obyektnilola bilməz, və yanilolarsa, 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.