როგორ ხდება რეფერენციული ტიპის გამოყენებით შექმნილი ობიექტების მეხსიერების გათავისუფლება?
sobes.tech AI
პასუხი AI-სგან
iOS-ში, რეფერენციული ტიპებით (მაგალითად, Swift-ის ან Objective-C-ის კლასებით) შექმნილი ობიექტები ავტომატური მიმთითებელი გამოთვლის სისტემით (ARC — Automatic Reference Counting) მართვადია. თითოეული ობიექტი ინახავს რეფერენციული გამოთვლის გამოთვლას — აქტიური მიმთითებლების რაოდენობას. როდესაც ახალი მიმთითებელი შეიქმნება ობიექტზე, გამოთვლი იზრდება, და როდესაც მიმთითებელი აღარ გამოიყენება (მაგალითად, ცვლადი გამოდის სქოპიდან ან მიენიჭება nil), გამოთვლი მცირდება.
როდესაც ობიექტის რეფერენციული გამოთვლის გამოთვლამ მიაღწია ნულს, ეს ნიშნავს, რომ მასზე აღარ არის მიმთითებელი, და ობიექტის დაკავებული მეხსიერება ავტომატურად თავისუფლდება. ეს ეხმარება მეხსიერების გაჟონვის თავიდან აცილებაში, ხელით მართვის გარეშე.
Swift-ის მაგალითი:
class Person {
var name: String
init(name: String) {
self.name = name
}
deinit {
print("ადამიანი \(name) გათავისუფლდა")
}
}
var p1: Person? = Person(name: "Ivan")
var p2 = p1 // მიმთითებლის გამოთვლა გაიზარდა
p1 = nil // გამოთვლა შემცირდა, მაგრამ ობიექტი ჯერ კიდევ არსებობს
p2 = nil // გამოთვლა 0-ია, ობიექტი გათავისუფლდა
მნიშვნელოვანია, ციკლური მიმთითებლების (retain cycles) თავიდან აცილება, როდესაც ორი ობიექტი ერთმანეთზე მიუთითებს, რაც ხელს უშლის მეხსიერების გათავისუფლებას. ამისთვის გამოიყენება weak ან unowned მიმთითებლები.