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 ობიექტი დეინიცირებულია