Я наткнулся на функцию под названием deinit()
, читая Руководство по языку Swift Programming Language, но мне все еще интересно, почему и когда мы необходимо реализовать его, поскольку нам не нужно управлять памятью.
С уважением.
Я наткнулся на функцию под названием deinit()
, читая Руководство по языку Swift Programming Language, но мне все еще интересно, почему и когда мы необходимо реализовать его, поскольку нам не нужно управлять памятью.
С уважением.
Не требуется, чтобы вы реализовали этот метод, но можете использовать его, если вам нужно выполнить какое-либо действие или очистить до освобождения объекта.
Документы 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)
}
}
Поэтому всякий раз, когда игрок удаляется из игры, его монеты возвращаются в банк.
Если ваш класс управляет дескриптором файла или другим ресурсом, вы можете закрыть этот дескриптор в deinit, чтобы убедиться, что он не живет после освобождения объекта.
Deinitilizer вызывается непосредственно перед тем, как экземпляр класса освобождается, и он полезен, когда вы работаете со своими собственными ресурсами. Для примера. Если вы создаете пользовательский класс для открытия файла и записи некоторых данных на него, вам может понадобиться закройте файл до того, как экземпляр класса будет освобожден. Очень важно определение класса может иметь не более одного деинтилизатора в классе
Деинициализатор вызывается непосредственно перед тем, как экземпляр класса будет освобожден. Вы пишете деинициализаторы с ключевым словом 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)
}
Если вы создаете большую часть операций в каком-либо объекте, который нужно освободить в своем темпе, вы можете сделать это в deinit