Swift - 析构



析构是释放类实例不再需要时内存资源的过程。析构器仅适用于类,不适用于结构体或枚举。Swift 不会立即在实例不再需要时调用析构器,而是在实例被释放之前调用它,这个时机由自动引用计数 (ARC) 系统管理。

  • 一个类只能有一个析构器。

  • 析构器是自动调用的,开发者不允许手动调用它们。

  • 析构器的调用时机不是由开发者显式控制的,而是由 ARC 自动确定的。

  • 循环引用可能会阻止析构。

  • 超类的析构器会被其子类继承,并且超类的析构器会在子类析构器的实现之后调用(即使子类没有自己的析构器)。

  • 众所周知,实例只有在其析构器被调用后才会被释放,这意味着析构器可以访问和修改实例的属性。

在类中定义析构器

在 Swift 中,我们可以在类中使用“deinit”关键字定义析构器。析构器中的代码将在类的实例被释放时执行。析构器不接受任何参数。

语法

以下是析构器的语法

class className{
   // Properties and methods of class
   // Deinitializer
   deinit {
      // statement
   }
}

示例

创建析构器的 Swift 程序。

// Defining class
class Student {

   // Property of class
   var name: String
    
   // Initializer to initialize instance
   init(name: String) {
      self.name = name
      print("\(name) is initialized")
   }
    
   // Deinitializer to deinitialize instance
   deinit {
      print("\(name) is deinitialized")
   }
}

// Creating and initializing instances of the student class 
var object1: Student? = Student(name: "Mira")
var object2: Student? = Student(name: "Jenni")

// Deinitializers will be called when instances are deallocated
object1 = nil
object2 = nil

输出

它将产生以下输出:

Mira is initialized
Jenni is initialized
Mira is deinitialized
Jenni is deinitialized

使用析构器释放内存空间

在 Swift 中,析构由自动引用计数 (ARC) 处理。自动引用计数是一种内存管理机制,用于跟踪实例引用并在不再需要对象时释放它们。尽管 Swift 自动释放内存资源,我们不需要执行手动清理,但如果我们正在使用自己的资源,那么我们可能需要手动清理它们。例如,如果我们创建一个自定义类来打开文件并向其中写入一些数据,我们可能需要在类实例被释放之前关闭文件。

现在,我们将看到析构器是如何工作的:

  • 步骤 1 - 使用“init”初始化器创建并初始化类的新的实例。

  • 步骤 2 - 使用具有强引用的类的实例。只要至少有一个强引用指向该对象,类的实例就会保持活动状态。

  • 步骤 3 - 当对对象的最后一个强引用终止时,ARC 将在对象被释放之前自动调用析构器。

  • 步骤 4 - 现在执行析构器中的代码,并且给定类的实例将被释放。内存可供其他对象使用。

这就是析构器的工作方式。

示例

演示析构器如何工作的 Swift 程序。

var counter = 0;  // for reference counting
class baseclass {
   init() {
      counter++;
   }
   deinit {
      counter--;
   }
}

var print: baseclass? = baseclass()
print(counter)
print = nil
print(counter)

输出

它将产生以下输出:

1
0

当省略print = nil语句时,计数器的值保持不变,因为它没有被析构。

示例

var counter = 0;  // for reference counting

class baseclass {
   init() {
      counter++;
   }
    
   deinit {
      counter--;
   }
}

var print: baseclass? = baseclass()

print(counter)
print(counter)

输出

它将产生以下输出:

1
1
广告