Intern
Tullantı toplayıcı (garbage collector) nədir?
sobes.tech Süni İntellekt
AI-dan cavab
iOS-də ənənəvi çöp toplayıcı yoxdur. Əvəzinə, Avtomatik Referans Sayımı (ARC) mexanizmi istifadə olunur.
- Avtomatik mexanizm: ARC obyektlərə güclü referansları avtomatik sayır.
- Yaddaşın azad olunması: Güclü referansların sayı sıfıra çatanda, ARC ayrılmış yaddaşı azad edir.
- Yaddaş sızmalarının qarşısını alma: Güclü, zəif və qeyri-mülkiyyətli (unowned) referansların düzgün istifadəsi yaddaş sızmalarını və güclü referans döngələrini qarşısını alır.
ARC-də referans növləri:
- Güclü (strong): Referans sayğacını artırır. Standartdır.
- Zəif (weak): Referans sayğacını artırmır. Ob'ekt dealloc ediləndə avtomatik
nilolur. Güclü referans döngələrini qarşısını almaq üçün istifadə olunur. Seçimli tip kimi elan edilir. - Qeyri-mülkiyyətli (unowned): Referans sayğacını artırmır. Referans göstərilən ob'ektin, qeyri-mülkiyyətli referansın bütün həyat dövrü ərzində mövcud olacağı təmin edilir. Seçimli deyil. İki ob'ekt qarşılıqlı güclü əlaqəyə malik olduqda, lakin biri daha qısa ömürlüdürsə, istifadə olunur.
ARC-nin üstünlükləri:
- Əvvəlcədən bilmək: Yaddaşın azad olunması, ob'ekt artıq istifadə olunmadıqda deterministik şəkildə baş verir.
- Performans: Arxa planda işləyən çöp toplayıcı üçün əlavə xərclər yoxdur, bu da fasilələrə səbəb ola bilər.
- Sadəlik: İnkişaf etdirici, əksər hallarda yaddaşı əl ilə idarə etməyə ehtiyac duymur, lakin referans sayğacının prinsiplərini anlamalıdır ki, sızmaları qarşısını alsın.
Güclü referans döngüsünün nümunəsi:
class Person {
let name: String
var apartment: Apartment? // Apartment-ə güclü referans
init(name: String) { self.name = name }
deinit { print("\(name) deinitialization") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Döngünü qarşısını almaq üçün zəif referans
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) deinitialization") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Burada weak istifadəsi kritikdir
john = nil
unit4A = nil
// Weak tenant olmadan: Həm john, həm də unit4A deinitialization olmayacaq.
// Weak tenant ilə: Həm john, həm də unit4A düzgün şəkildə deinitialization olur.