Swift 什么是去初始化器,它是如何写的
在这篇文章中,你将学习如何以及为什么在Swift语言中使用去初始化器。你将通过一些例子来学习去初始化的概念。
当一个类实例不再需要时,Swift会自动调用一个特定的方法,称为去初始化器。它被用来在从内存中取消分配一个项目之前进行任何必要的清理工作。”deinit “关键字用于创建一个去初始化器,它没有参数或输出。
语法
以下是Swift中去初始化器的基本语法
class ClassName {
// Other properties and methods
deinit {
// Perform cleanup tasks
}
}
你可以使用deinit块来执行清理任务,如释放资源(如关闭文件,释放内存),取消预定任务,释放内存等。
一旦一个类实例要从内存中解配出来,就会调用一个去初始化器。这表明它被用来执行任何在项目从内存中删除之前必须进行的清理程序。这可能涉及到做一些事情,比如释放项目使用时分配的内存。它也可能需要取消任何计划中的连接任务或关闭任何开放文件。
去初始化器只对类起作用,不支持结构。这是由于结构体不能被取消分配。它们是值类型,当它们对应的变量离开其范围时,内存会被取消分配。
例子
下面是一个使用去初始化器来取消预定任务的类的例子
import Foundation
class MyTimer {
var timer: Timer?
init() {
timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)
}
deinit {
timer?.invalidate()
}
@objc func timerFired() {
// do something
}
}
在上面的例子中,当MyTImer类被初始化时,它会创建一个定时器。当类的实例不再需要时,这个定时器会自动取消。去初始化器调用定时器的invalidate方法来取消预定任务。
关键是要记住,去初始化器只有在不再需要类实例时才会被调用。这样做的实际效果是将实例的引用计数减少到0。
例子
下面是另一个使用去初始化器来释放在其生命周期中分配的内存的类的例子
import Foundation
class MyData {
var data: UnsafeMutableRawPointer?
var size: Int
init(size: Int) {
self.size = size
data = UnsafeMutableRawPointer.allocate(byteCount: size, alignment: 1)
}
deinit {
data?.deallocate()
}
}
在这个例子中,初始化后,类MyData通过调用UnsafeMutableRawPointer的分配函数来分配内存。当一个类的实例不再需要时,内存会被自动去分配。为了释放内存,去初始化器会执行数据指针的deallocate过程。
例子
下面是另一个有用的例子,这个类使用脱初始化器来释放使用单子模式获得的资源
import Foundation
class MySingleton {
static let shared = MySingleton()
var resource: Resource?
private init() {
resource = acquireResource()
}
deinit {
releaseResource(resource: resource)
}
}
在上面的例子中,在MySingleton类被初始化后,它使用了acquisitionResource函数来获取资源。一旦类实例使用完毕,资源将被自动删除。为了执行这个操作,deinitializer调用releaseResource函数,将资源作为参数。
注意 – MySignleton类使用了一个单子模式,它的实例被整个应用程序共享。 因此,脱初始化器将不会被调用,因为该类的实例不会被解配。
以下是在Swift中使用脱初始化器的一些优势
- 资源管理– 在一个对象从内存中删除之前,你可以使用去初始化器执行任何必要的清理操作。这可以包括释放内存、结束打开的文件和停止预定操作等操作。
-
内存管理– 当一个类的实例不再需要时,去初始化器是一个很好的方法,可以确保资源以正确的方式被释放。通过这样做,可以避免内存泄漏–这可能导致应用程序使用超过必要的内存–。
-
错误处理 – 你不必担心手动调用去初始化器,因为它们是自动调用的。这就意味着,即使在出现错误的情况下,去初始化器也可以进行清理操作,这可以帮助防止应用程序崩溃。
-
适当的清理– 当你创建一个包含对另一个资源的引用的对象时,要使资源被取消分配。去初始化器可以帮助你以一种可靠的、有规律的方式完成这一工作。
-
一致的资源使用– 保证在一个类的所有实例中统一获得和释放资源的一个好技术是使用去初始化器。通过这样做,可以避免错误,也可以更简单地理解一个应用程序的行为方式。
-
良好的实践– 推荐使用去初始化,因为它保证了资源的正确释放,是内存管理的最佳实践。通过这样做,你可以确保你的代码不会留下任何开放的文件或自由的RAM。
总结
在Swift中,你可以使用去初始化器来释放代码中的内存用量。你可以确保资源在不再需要时被正确地去分配。它有助于管理内存泄漏和其他可能发生在应用程序中的错误,并呈现出崩溃的可能性。