Sobes.tech
Middle

რა განსხვავებაა ნაგვის შეგროვებელს (garbage collector) და ავტომატურ მეხსიერების მართვას (ARC)?

sobes.tech AI

პასუხი AI-სგან

ავტომატური შეგროვება ავტომატურად პოულობს და თავისუფლდებს მეხსიერებას, რომელიც პროგრამის მიერ აღარ გამოიყენება. ის მუშაობს ფონურ რეჟიმში, პერიოდულად სკანირებს ხუთს და იდენტიფიცირებს ობიექტებს, რომელთაც არ აქვთ აქტიური მითითებები.

ARC (Automatic Reference Counting) Swift და Objective-C-ში მართავს ობიექტების ცხოვრებას, ითვლის თითოეული ობიექტზე ძლიერი მითითებების რაოდენობას. როდესაც რაოდენობა მიაღწევს ნულს, ARC ავტომატურად თავისუფლდებს ამ ობიექტის მიერ დაკავებულ მეხსიერებას.

ძირითადი განსხვავებები:

მახასიათებელი შეგროვება ARC
მუშაობის პრინციპი მიუწვდომელი ობიექტების ძიება ძლიერი მითითებების რაოდენობა
გათავისუფლების მომენტი არაპროგნოზირებადი, სკანირების დროს პრედიქტიული, როდესაც მითითებები 0-ია
ხარჯები პროგრამის შესრულების დროს პაუზები მცირე, ცვლილების დროს
პროგნოზირებადობა დაბალი მაღალი
ციკლური მითითებები საჭიროებს სპეციალურ მიდგომებს (მაგ. სუსტი მითითებები) საჭიროებს weak ან unowned მითითებებს
გამოყენება iOS-ში არ არის ხელმისაწვდომი თანამედროვე Objective-C და Swift-ში ძირითადი მექანიზმი მეხსიერების მართვაში Objective-C და Swift-ში

weak გამოყენების მაგალითი ძლიერი მითითებების ციკლის თავიდან ასაცილებლად ARC-ში:

class Person {
    let name: String
    var apartment: Apartment? // ძლიერი მითითება

    init(name: String) {
        self.name = name
        print("\(name) ინიცირებულია")
    }
    deinit {
        print("\(name) დეინიცირებულია")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // სუსტი მითითება

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) ინიცირებულია")
    }
    deinit {
        print("Apartment \(unit) დეინიცირებულია")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // სუსტი მითითება ციკლს აფერხებს

john = nil // Person ობიექტი დეინიცირებულია
unit4A = nil // Apartment ობიექტი დეინიცირებულია