Sobes.tech
Junior

iOS-də ARC (Avtomatik İstinad Sayımı) nədir?

sobes.tech Süni İntellekt

AI-dan cavab

ARC, iOS-də yaddaş idarəetmə mexanizmidir və avtomatik olaraq obyektlərə olan istinadların sayını sayır. Bir obyektə olan istinadların sayı sıfıra çatdıqda, ARC avtomatik olaraq həmin obyektin tutduğu yaddaşı sərbəst buraxır.

ARC-nin üstünlükləri:

  • Yaddaş sızmalarının azaldılması: Yaddaşın sərbəst buraxılması prosesinin avtomatlaşdırılması, unudulmuş release və ya dealloc ilə əlaqəli səhvlərin ehtimalını azaldır.
  • İki dəfə sərbəst buraxmadan yaranan çökmələrin qarşısını alma: ARC, artıq sərbəst buraxılmış yaddaşı yenidən sərbəst buraxmağa cəhdləri qarşısını alır.
  • Kodu sadələşdirmək: İnkişaf etdirici yaddaşı əl ilə idarə etməyə ehtiyac duymur, bu da kodu daha təmiz və anlaşılan edir.

Avtomatlaşdırma olsa da, ARC istifadə edərkən güclü və zəif istinad anlayışlarını başa düşmək vacibdir ki, güclü istinad döngələri (retain cycles) qarşısını almaq mümkün olsun.

Güclü istinad nümunəsi:

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) başlanır")
    }

    deinit {
        print("\(name) sonlandırılır")
    }
}

class Apartment {
    var unit: String
    var tenant: Person? // Güclü istinad

    init(unit: String) {
        self.unit = unit
        print("Mənzil \(unit) başlanır")
    }

    deinit {
        print("Mənzil \(unit) sonlandırılır")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Hər iki tərəfdə güclü istinad yaradılması
john!.apartment = unit4A
unit4A!.tenant = john

// İstinadların sıfırlanması döngü yaratmır
john = nil
unit4A = nil

Döngünü pozmaq üçün zəif istinad nümunəsi:

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) başlanır")
    }

    deinit {
        print("\(name) sonlandırılır")
    }
}

class Apartment {
    var unit: String
    weak var tenant: Person? // Zəif istinad

    init(unit: String) {
        self.unit = unit
        print("Mənzil \(unit) başlanır")
    }

    deinit {
        print("Mənzil \(unit) sonlandırılır")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john

// İstinadların sıfırlanması döngünü pozur (deinit çağırılır)
john = nil // Person sonlandırıldı
unit4A = nil // Apartment sonlandırıldı

ARC, sinif obyektlərinə tətbiq edilir. Strukturlar və enumerasiyalar dəyər tipləridir və avtomatik yaddaş idarəetməsinə tabe deyillər.