티스토리 뷰

iOS

[Swift] 소멸자 (Deinitialization)

Peppo 2022. 5. 15. 00:19
728x90

소멸자 (Deinitialization) 

 

Deinitialization는 클래스 인스턴스가 할당 해제되기 직전에 호출됩니다.

deinit은 클래스에서만 사용할 수 있습니다.

 

 

소멸자의 동작 (How Deinitialization Works)

 

Swift는 더이상 필요로하지 않는 자원의 해지를 자동으로 해줍니다. (ARC)

하지만 사용자가 자원 해지를 수동으로 해줘야 하는 경우도 있는데, 이때 사용하는게 deinit 입니다.

소멸자는 클래스당 하나만 선언할 수 있고, 파라미터를 받을 수 없습니다. 

형태는 아래와 같습니다.

 

deinit {
  // perform the deinitialization
}

 

deinitializer 는 클래스의 인스턴스 메모리 해제가 필요할때 자동으로 호출 되며, 수동 호출이 불가 합니다.

즉, 인스턴스가 메모리 해제되기 직전에 호출된다는 말이죠!

 

상위클래스 소멸자는 하위클래스 소멸자 구현이 끝날때 자동으로 호출됩니다.

상위클래스 소멸자는 하위클래스 소멸자가 없어도 자동으로 호출 됩니다.

 


소멸자가 구현되는 방식 (Deinitializer in Action)

 

소멸자가 호출되기 전까지 인스턴스는 메모리에서 해제되지 않기 때문에, 소멸자는 호출되는 인스턴스의 모든 프로퍼티에 접근할 수 있습니다.

아래 예제를 보면서 확인해 보겠습니다.

class Dog {
    var breed: String
    var name: String
    var age: Int

    init(breed: String, name: String, age: Int) {
        self.breed = breed
        self.name = name
        self.age = age
    }

    deinit {
        print("deinit dog class instance")
    }
}

var dagam: Dog? = Dog(breed: "poodle",
                      name: "dagam",
                      age: 4)

dagam = nil // deinit dog class instance

작동 순서 

  • dagam은 Dog 클래스의 인스턴스 객체 입니다.
  • 인스턴스가 생성된 이후 dagam 인스턴스에 nil을 할당하게 되면 초기화할게 없어지니
    deinit 소멸자가 호출되어 "deinit dog class instance" 가 프린트 됩니다.
  • dagam 클래스 인스턴스의 메모리가 해제 됩니다.
728x90