რა არის სუსტი და ძლიერი ბმულების განსხვავება?
sobes.tech AI
პასუხი AI-სგან
მეხსიერების მართვის მექანიზმის განსხვავება (ARC - ავტომატური მითითების გამოთვლა):
-
მყარი მითითება (Strong reference): ზრდის ობიექტის მითითებების რაოდენობას 1-ით. ობიექტი ვერ იქნება გათავისუფლებული მეხსიერებიდან, სანამ მასზე არსებობს მინიმუმ ერთი მყარი მითითება. ეს არის Swift-ის სტანდარტული ქცევა თვისებებისთვის და ცვლადებისთვის:
-
სუსტი მითითება (Weak reference): არ ზრდის ობიექტის მითითებების რაოდენობას. გამოიყენება ციკლური მითითებების თავიდან ასაცილებლად, როდესაც ორი ან მეტი ობიექტი აქვს ერთმანეთზე მყარი მითითებები, რაც ქმნის მეხსიერების გაჟონვას. სუსტი მითითებები ყოველთვის ოპციონალურია (
Optional), რადგან მითითებული ობიექტი ნებისმიერ დროს შეიძლება განულდეს. თუ ობიექტი განულდა, სუსტი მითითება ავტომატურად ხდებაnil:
ციკლური მითითების თავიდან ასაცილებლად სუსტი მითითების გამოყენების მაგალითი:
class Person {
let name: String
var apartment: Apartment? // თავდაპირველად მყარი მითითება
init(name: String) { self.name = name }
deinit { print("\(name) განულებულია") }
}
class Apartment {
let unit: String
weak var tenant: Person? // სუსტი მითითება
init(unit: String) { self.unit = unit }
deinit { print("ბინა \(unit) განულებულია") }
}
var john: Person? // Person ობიექტი
var unit4A: Apartment? // Apartment ობიექტი
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// ციკლური მითითების შექმნა:
// john-ს აქვს მყარი მითითება ბინაზე
// ბინას აქვს მყარი მითითება ადამიანს
john!.apartment = unit4A
unit4A!.tenant = john // ეს უნდა იყოს სუსტი, ციკლის შესაჩერებლად
john = nil // john-ს მინიჭება nil, ის არ განულდება თუ ციკლი არსებობს
unit4A = nil // იგივე, თუ ციკლი არსებობს, არ განულდება
// მოსალოდნელი გამოსავალი:
// John Appleseed განულებულია
// ბინა 4A განულებულია
თუ weak არ გამოიყენებოდა tenant-ზე, დეინიციალიზატორები არ გამოიძახებოდა, რაც მიუთითებს მეხსიერების გაჟონვაზე.