Подтвердить что ты не робот

Когда следует использовать deinit?

Я наткнулся на функцию под названием deinit(), читая Руководство по языку Swift Programming Language, но мне все еще интересно, почему и когда мы необходимо реализовать его, поскольку нам не нужно управлять памятью.

С уважением.

4b9b3361

Ответ 1

Не требуется, чтобы вы реализовали этот метод, но можете использовать его, если вам нужно выполнить какое-либо действие или очистить до освобождения объекта.

Документы Apple включают пример:

struct Bank {
    static var coinsInBank = 10_000
    static func vendCoins(var numberOfCoinsToVend: Int) -> Int {
        numberOfCoinsToVend = min(numberOfCoinsToVend, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receiveCoins(coins: Int) {
        coinsInBank += coins
    }
}

class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.vendCoins(coins)
    }
    func winCoins(coins: Int) {
        coinsInPurse += Bank.vendCoins(coins)
    }
    deinit {
        Bank.receiveCoins(coinsInPurse)
    }
}

Поэтому всякий раз, когда игрок удаляется из игры, его монеты возвращаются в банк.

Ответ 2

Если ваш класс управляет дескриптором файла или другим ресурсом, вы можете закрыть этот дескриптор в deinit, чтобы убедиться, что он не живет после освобождения объекта.

Ответ 3

Deinitilizer вызывается непосредственно перед тем, как экземпляр класса освобождается, и он полезен, когда вы работаете со своими собственными ресурсами. Для примера. Если вы создаете пользовательский класс для открытия файла и записи некоторых данных на него, вам может понадобиться закройте файл до того, как экземпляр класса будет освобожден. Очень важно определение класса может иметь не более одного деинтилизатора в классе

Ответ 4

Деинициализатор вызывается непосредственно перед тем, как экземпляр класса будет освобожден. Вы пишете деинициализаторы с ключевым словом deinit, подобно тому, как инициализаторы написаны с ключевым словом init. Deinitializers доступны только для типов классов. Определения групп могут иметь не более одного деинициализатора в классе. Деинициализатор не принимает никаких параметров и записывается без круглых скобок. Я использовал deinit для удаленияObserver уведомления из приложения, как указано ниже.

deinit {
    NotificationCenter.default.removeObserver(self, name: 
    NSNotification.Name(rawValue: "gotoLogin"), object: nil)
    NotificationCenter.default.removeObserver(self, name: 
    NSNotification.Name(rawValue: "gotoMain"), object: nil)
    NotificationCenter.default.removeObserver(self, name: 
    NSNotification.Name(rawValue: "gotoRegister"), object: 
    nil)
    NotificationCenter.default.removeObserver(self, name: 
    NSNotification.Name(rawValue: "gotoBook"), object: nil)
    NotificationCenter.default.removeObserver(self, name: 
    NSNotification.Name(rawValue: "gotoCurrentMainMenu"), 
    object: nil)
    NotificationCenter.default.removeObserver(self, name: 
    NSNotification.Name(rawValue: "gotoEventMenu"), 
    object: nil)
}

Ответ 5

Если вы создаете большую часть операций в каком-либо объекте, который нужно освободить в своем темпе, вы можете сделать это в deinit