Sobes.tech
Junior

Mis on ARC (Automaatne viidete arvutamine) iOS-is?

sobes.tech AI

Vastus AI-lt

ARC — see on mäluhaldu mehhanism iOS-is, mis automaatselt arvutab objektidele viidete arvu. Kui viidete arv objekti peale nulli, vabastab ARC automaatselt selle objekti poolt kasutatud mälu.

ARC eelised:

  • Vähendab mälu lekked: Automaatne mälu vabastamise protsess vähendab vigu, mis on seotud unustatud release või dealloc käskudega.
  • Vähendab krahhe duplikaalse vabastamise tõttu: ARC takistab katseid vabastada juba vaba mälu.
  • Koodi lihtsustamine: Arendaja ei pea mälu käsitsi haldama, mis muudab koodi puhtamaks ja arusaadavamaks.

Vaatamata automatiseerimisele on ARC kasutamisel oluline mõista tugevate ja nõrkade viidete kontseptsioone, et vältida tugevate viidete tsükleid (retain cycles).

Tugeva viite näide:

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

    init(name: String) {
        self.name = name
        print("\(name) on initsialiseeritud")
    }

    deinit {
        print("\(name) on de-initsialiseeritud")
    }
}

class Apartment {
    var unit: String
    var tenant: Person? // Tugev viide

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) on initsialiseeritud")
    }

    deinit {
        print("Apartment \(unit) on de-initsialiseeritud")
    }
}

var john: Person?
var unit4A: Apartment?

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

// Loome tugeva viite mõlemalt poolt
john!.apartment = unit4A
unit4A!.tenant = john

// Viidete kustutamine ei põhjusta deinit, kuna on tsükkel
john = nil
unit4A = nil

Nõrga viite näide tsükli katkestamiseks:

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

    init(name: String) {
        self.name = name
        print("\(name) on initsialiseeritud")
    }

    deinit {
        print("\(name) on de-initsialiseeritud")
    }
}

class Apartment {
    var unit: String
    weak var tenant: Person? // Nõrk viide

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) on initsialiseeritud")
    }

    deinit {
        print("Apartment \(unit) on de-initsialiseeritud")
    }
}

var john: Person?
var unit4A: Apartment?

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

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

// Viidete kustutamine viib deinit-ni (tsükkel on katkestatud)
john = nil // Person on de-initsialiseeritud
unit4A = nil // Apartment on de-initsialiseeritud

ARC rakendub klassi objektidele. Struktuurid ja enumeratsioonid on väärtusetüübid ning neid ei hallata automaatselt ARC abil.