Junior
როგორ მუშაობს ნაგვის შეგროვებელი?
sobes.tech AI
პასუხი AI-სგან
iOS/macOS განვითარების კონტექსტში Swift/Objective-C იყენებს არა გროვერის შეგროვებას (GC), არამედ ავტომატურ მითითებების გამოთვლას (Automatic Reference Counting, ARC).
ARC ავტომატურად მართავს მეხსიერებას, ითვლის თითოეული კლასი (და დახურვები) ძლიერი მითითებების რაოდენობას. როდესაც ძლიერი მითითებების გამოთვლა ნულზე იწევს, სისტემა თავისუფლდებს ობიექტის დაკავებულ მეხსიერებას:
ARC-ის ძირითადი მახასიათებლები:
- ძალა (Strong): ზრდის მითითებების რაოდენობას. ობიექტი რჩება მეხსიერებაში, სანამ მასზე მინიმუმ ერთი ძლიერი მითითება არსებობს:
- სუსტი (Weak): არ ზრდის მითითებების რაოდენობას. გამოიყენება ძლიერი მითითებების ციკლების თავიდან ასაცილებლად. სუსტი მითითებები ოპციონალურია და ობიექტის გათავისუფლებისას nil ხდება:
- მიუკერძოებელი (Unowned): არ ზრდის მითითებების რაოდენობას. გამოიყენება, როდესაც ობიექტების სიცოცხლის ციკლი ცნობილია და ერთი ობიექტი ყოველთვის იქნება მეორის არსებობის დროს. მითითება არ არის ოპციონალური. თუ მითითებული ობიექტი გათავისუფლდა, წვდომის მცდელობა გამოიწვევს შესრულების დროს შეცდომას:
ARC მუშაობს კომპილაციის ეტაპზე, სადაც ის ხდის retain (მოთხოვნის გაზრდა) და release (მცირება) ზარებს შესაბამის კოდში:
class MyClass {
var prop: String = ""
}
var reference1: MyClass? = MyClass() // გამოთვლა = 1
var reference2 = reference1 // გამოთვლა = 2
reference1 = nil // გამოთვლა = 1
reference2 = nil // გამოთვლა = 0, ობიექტი გათავისუფლდა
class Person {
let name: String
weak var apartment: Apartment? // სუსტი მითითება ციკლის თავიდან ასაცილებლად
init(name: String) { self.name = name; print("(სახელი) ინიცირებულია") }
deinit { print("(სახელი) დეინიცირებულია") }
}
class Apartment {
let unit: String
unowned var tenant: Person // მიუკერძოებელი მითითება
init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Apartment \(unit) ინიცირებულია") }
deinit { print("Apartment \(unit) დეინიცირებულია") }
}