Sobes.tech
Junior

Kas yra deinitializatorius?

sobes.tech AI

Atsakymas iš AI

Deinit (išvalymas) — tai specialus metodas, kuris iškviečiamas tiesiogiai prieš klasės egzemplioriaus išlaisvinimą iš atminties. Jis naudojamas bet kokiam būtinam valymui ar darbo pabaigai.

Pagrindinės savybės:

  • Tinka tik klasėms. Struktūros ir išvardijimai neturi deinit.
  • Gali būti tik vienas klasėje.
  • Nėra priimami parametrai ir negrąžina reikšmių.
  • Automatiškai iškviečiamas. Jo aiškus iškvietimas nėra įmanomas.
  • Paveldi iš superklasės. Subklaso deinit iškviečiamas prieš superklaso deinit.

Tipinės užduotys deinit:

  • Išteklių atlaisvinimas (pvz., failų uždarymas, pranešimų prenumeratos atšaukimas, tinklo užklausų atšaukimas).
  • Bet kokių kitų objektų ar būsenų valymas.

Naudojimo pavyzdys:

class FileHandler {
    var fileDescriptor: Int32?

    init(filePath: String) {
        // Atidaryti failą
        fileDescriptor = open(filePath, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)
        if fileDescriptor == -1 {
            print("Nepavyko atidaryti failo")
            fileDescriptor = nil
        } else {
            print("Failas atidarytas su deskriptoriu: \(fileDescriptor!)")
        }
    }

    deinit {
        // Uždaryti failą prieš išlaisvinant objektą
        if let fd = fileDescriptor {
            close(fd)
            print("Deskriptorius \(fd) uždarytas.")
        }
        print("FileHandler egzempliorius išvalytas.")
    }
}

// Sukuriamas klasės egzempliorius
var handler: FileHandler? = FileHandler(filePath: "mydata.txt")

// Darbas su failu

// Nuvalyti nuorodą, kad egzempliorius galėtų būti išlaisvintas
handler = nil // Čia bus iškviestas deinit

deinit glaudžiai susijęs su Swift atminties valdymo mechanizmu (ARC - Automatinis nuorodų skaičiavimas). ARC stebi nuorodų į objektus skaičių. Kai stiprių nuorodų skaičius pasiekia nulį, ARC išlaisvina objektą ir prieš tai iškviečia jo deinit.