Intern
რა არის ნაგვის შეგროვებელი (garbage collector)?
sobes.tech AI
პასუხი AI-სგან
iOS-ში ტრადიციული გროვერი არ არსებობს. მის ნაცვლად გამოიყენება Automatic Reference Counting (ARC) მექანიზმი.
- ავტომატური მექანიზმი: ARC ავტომატურად ითვლის ობიექტებზე ძლიერი მითითებების რაოდენობას.
- მეხსიერების გათავისუფლება: როდესაც ობიექტზე ძლიერი მითითებების რაოდენობა ნულზე მიაღწევს, ARC გათავისუფლებს გამოყოფილ მეხსიერებას.
- გადაუვლის გაჟონვები: სწორი გამოყენება ძლიერი, სუსტი და უვნებელი (unowned) მითითებების საშუალებას აძლევს თავიდან აიცილოს მეხსიერების გაჟონვები და ძლიერი მითითებების ციკლები.
ARC-ის მითითებების ტიპები:
- ძლიერი (strong): ზრდის მითითებების გამოთვლას. დეფოლტად.
- სუსტი (weak): არ ზრდის მითითებების გამოთვლას. ავტომატურად ხდება
nilობიექტის dealloc-ის დროს. გამოიყენება ციკლების თავიდან ასაცილებლად. გამოაცხადება როგორც არჩევითი ტიპი. - უვნებელი (unowned): არ ზრდის მითითებების გამოთვლას. გარანტირებულია, რომ ის ობიექტი, რომელსაც ის ეხება, არსებობს მთელი სიცოცხლის განმავლობაში. არ არის არჩევითი. გამოიყენება, როდესაც ორი ობიექტი აქვს ურთიერთმტკიცე კავშირი, მაგრამ ერთს აქვს მოკლე სიცოცხლის ციკლი.
ARC-ის უპირატესობები:
- განსაზღვრული: მეხსიერების გათავისუფლება ხდება დეტერმინისტულად, როგორც კი ობიექტი აღარ გამოიყენება.
- პროდუქტიულობა: არ არსებობს დამატებითი ხარჯები ფონის გროვერისთვის, რომელიც შეიძლება გამოიწვიოს გაჩერებები.
- სადამსახურო: დეველოპერმა არ უნდა მართოს მეხსიერება ხელით უმეტეს შემთხვევაში, მაგრამ უნდა გაიგოს მითითებების გამოთვლის პრინციპები, რათა თავიდან აიცილოს გაჟონვები.
მაგალითი ძლიერი მითითებების ციკლის:
class Person {
let name: String
var apartment: Apartment? // ძლიერი მითითება — Apartment-ზე
init(name: String) { self.name = name }
deinit { print("\(name) ამოწურულია") }
}
class Apartment {
let unit: String
weak var tenant: Person? // სუსტი მითითება — Person-ზე, ციკლის თავიდან ასაცილებლად
init(unit: String) { self.unit = 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 // გამოყენება weak, ეს ძალიან მნიშვნელოვანია
john = nil
unit4A = nil
// Weak tenant-თან: ორივე ჯონი და აპარტამენტი სწორად ამოწურავს
// Weak tenant-თან: ორივე ჯონი და აპარტამენტი სწორად ამოწურავს