[Swift] deinit(초기화 해제)

·2024년 7월 8일
0

Swift 문법

목록 보기
15/16

deinit

초기화 해제 구문은 클래스 타입에서만 사용 가능

Swift는 클래스 인스턴스가 더이상 필요하지 않을 때 자동으로 할당 해제

Swift는 ARC를 사용하여 메모리를 관리하기 때문에, 일반적으로 우리가 직접 구현해서 수행할 필요는 없음.

하지만 deinit 시, 해야 할 작업이 있을 수도 있다.


선언

deinit {

}
  • 클래스 당 하나의 초기화 해제 구문
  • 파라미터 x
  • 인스턴스가 할당 해제되기 직전에 자동으로 호출
    • 따라서 직접 호출할 필요없음.
  • 상위 클래스의 초기화 해제 구문은 하위 클래스 초기화 해제 구문으로 상속됨
    • 하위 클래스 초기화 해제 구문이 끝날 때 자동으로 호출됨
    • 상위 클래스 초기화 해제 구문은 하위 클래스에 초기화 해제 구문이 없더라도 항상 호출됨


초기화 해제 구문 동작

기본 예제

class Student {
    var name: String?
    var age: Int?
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
        print("init...")
    }
    
    deinit {
        print("deinit...")
    }
}

var min: Student? = Student(name: "Min", age: 24) // init...
min = nil // deinit...

상속 예제

class Person {
    var name: String?
    var age: Int?
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
        print("Person Initialized")
    }
    
    deinit {
        print("Person Deinitialized")
    }
}

class Student: Person {
    var grade: Int?
    
    init(grade: Int, name: String, age: Int) {
        self.grade = grade
        super.init(name: name, age: age)
        print("Student Initialized")
    }
    
    deinit {
        print("Student Deinitialized")
    }
}

var min: Student? = Student(grade: 3, name: "Min", age: 24)
// Person Initialized
// Student Initialized
min = nil
//Student Deinitialized
//Person Deinitialized
  • 상위 클래스 초기화 해제 구문은 하위 클래스 초기화 해제 구문으로 상속
  • 하위 클래스 초기화 해제 구문 구현이 끝날 때 자동으로 호출됨

하위 클래스에 초기화 해제 구문이 없는 경우

class Person {
    var name: String?
    var age: Int?
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
        print("Person Initialized")
    }
    
    deinit {
        print("Person Deinitialized")
    }
}

class Student: Person {
    var grade: Int?
    
    init(grade: Int, name: String, age: Int) {
        self.grade = grade
        super.init(name: name, age: age)
        print("Student Initialized")
    }
}

var min: Student? = Student(grade: 3, name: "Min", age: 24)
// Person Initialized
// Student Initialized
min = nil
// Person Deinitialize
  • 상위 클래스 초기화 해제 구문은 하위 클래스에 초기화 해제 구문이 없더라도 항상 호출됨


Reference

https://bbiguduk.gitbook.io/swift/language-guide-1/deinitialization

0개의 댓글

Powered by GraphCDN, the GraphQL CDN