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 Reference):
- არ ზრდის მითითებების რაოდენობას.
- საშუალებას აძლევს ობიექტის დეალოკაციას, თუ მასზე აღარ არის მტკიცე კავშირი.
- გამოაცხადება
unownedკლავიშის გამოყენებით. - არ არის ოპციონალური. მოსალოდნელია, რომ სურათის ობიექტი ყოველთვის იქნება არსებობაში, სანამ მასში არსებული სუსტი კავშირი არსებობს.
- გამოყენება, როდესაც ობიექტი ყოველთვის უნდა არსებობდეს, სანამ მეორე ობიექტი არსებობს (
CreditCardყოველთვის ეკუთვნისCustomer). - გამოყენებისას, თუ ობიექტი უკვე დეალოკირებულია, მოხდება შეცდომა (crash).
- გამოიყენება მტკიცე კავშირების ციკლების თავიდან ასაცილებლად, როდესაც ერთი ობიექტი ყოველთვის უნდა არსებობდეს, სანამ მეორე ობიექტი არსებობს, და შეუძლებელია, რომ ერთ-ერთი
nil-ში გადავიდეს (მაგ.self-ის ბმული ლამბდასახლებებში).
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!) // თუ მომხმარებელი ნულდება, ბარათი, რომელიც მასზე მიუთითებს unowned-ით, // გახდება გაუქმებული, მაგრამ ციკლი არ შექმნის. john = nil // ორივე ობიექტი დეალოკირდება
სარჩევი weak და unowned შორის დამოკიდებულია ურთიერთობის ხასიათზე: გამოიყენეთ weak, როდესაც ერთი ობიექტი შესაძლოა არსებობდეს მეორის გარეშე (Person-ი Apartment-ის გარეშე), და unowned, როდესაც ერთი ობიექტი ყოველთვის უნდა არსებობდეს, სანამ მეორე არსებობს (CreditCard ყოველთვის ეკუთვნის Customer).