Sobes.tech
Junior

რა არის სუსტი და ძლიერი ბმულების განსხვავება?

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-ზე, დეინიციალიზატორები არ გამოიძახებოდა, რაც მიუთითებს მეხსიერების გაჟონვაზე.