programing

스위프트에서 할당 해제

showcode 2023. 4. 20. 23:23
반응형

스위프트에서 할당 해제

뷰 컨트롤러의 수명이 다한 시점에서 청소(즉, View Controller를 삭제)를 몇 가지 수행하고 싶다.NSNotificationCenter알림.실장deallocSwift 컴파일러 오류가 발생합니다.

Cannot override 'dealloc' which has been marked unavailable

Swift에서 개체의 수명이 다했을 때 정리를 수행할 때 선호하는 방법은 무엇입니까?

deinit {
    // perform the deinitialization
}

Swift 문서:

클래스 인스턴스가 할당 해제되기 직전에 디인셜라이저가 호출됩니다.init 키워드를 사용하여 initializer를 쓰는 방법과 마찬가지로 deinit 키워드를 사용하여 deinitizer를 씁니다.디초기화자는 클래스 유형에서만 사용할 수 있습니다.

일반적으로 인스턴스가 할당 해제되면 수동 정리를 수행할 필요가 없습니다.그러나 자체 리소스로 작업하는 경우 직접 몇 가지 정리를 추가로 수행해야 할 수 있습니다.예를 들어 파일을 열고 일부 데이터를 쓰는 사용자 정의 클래스를 생성하는 경우 클래스 인스턴스의 할당이 취소되기 전에 파일을 닫아야 할 수 있습니다.

deinit {
    // perform the deinitialization
}

Swift "dealloc"의 정답입니다.

그러나 iOS 9에서 NSNotification Center를 더 이상 청소할 필요가 없다는 새로운 점을 지적하는 것이 좋습니다.

https://developer.apple.com/library/content/releasenotes/Foundation/RN-FoundationOlderNotes/index.html#X10_11Notes

NSNotification Center

OS X 10.11 및 iOS 9.0에서는 NSNotificationCenter 및 NSDistributed NotificationCenter는 할당 해제될 수 있는 등록된 관찰자에게 알림을 보내지 않습니다.관찰자를 영점 약 기준으로 저장할 수 있는 경우 기본 저장소는 관찰자를 영점 약 기준으로 저장합니다. 그렇지 않으면 개체를 약하게 저장할 수 없습니다(즉,).이것은 실행 시 오브젝트를 약하게 저장할 수 없도록 하는 커스텀 유지/해제 메커니즘이 있습니다). 오브젝트를 약하지 않은 제로링 참조로 저장합니다.즉, 옵서버는 할당 해제 방식으로 등록을 취소할 필요가 없습니다.그 옵서버로 라우팅되는 다음 통지는 제로화된 참조를 검출하여 옵서버의 등록을 자동으로 해제합니다.오브젝트가 약하게 참조될 수 있는 경우 할당 해제 중에 옵서버로 알림이 전송되지 않습니다.약하게 제로화되지 않은 참조 옵서버의 경우 할당 해제 중에 알림을 수신하는 이전 동작은 그대로 유지됩니다.[NSNotificationCenter addObserverForName:object:queue:usingBlock] 메서드를 통한 블록 기반 옵서버는 시스템에서 여전히 이러한 옵서버에 대한 강력한 참조를 보유하고 있으므로 더 이상 사용하지 않을 경우 등록을 취소해야 합니다.관찰자(약하게 참조되거나 영점 참조됨)를 조기에 제거하는 것은 여전히 지원됩니다.옵서버가 객체가 아닐 수 있으므로 CFNotificationCenterAddObserver는 이 동작에 적합하지 않습니다.

단, 강력한 레퍼런스에 대해서는 아래의 점에 주의해 주십시오.그래서 청소에 대해 걱정해야 할 수도 있습니다...?

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

Swift는 더 이상 필요하지 않은 인스턴스를 자동으로 할당 해제하여 리소스를 해방합니다.Swift는 Automatic Reference Counting(ARC; 자동 참조 카운트)에 설명된 대로 인스턴스의 메모리 관리를 처리합니다.일반적으로 인스턴스가 할당 해제되면 수동 정리를 수행할 필요가 없습니다.그러나 자체 리소스로 작업하는 경우 직접 몇 가지 정리를 추가로 수행해야 할 수 있습니다.예를 들어 파일을 열고 일부 데이터를 쓰는 사용자 정의 클래스를 생성하는 경우 클래스 인스턴스의 할당이 취소되기 전에 파일을 닫아야 할 수 있습니다.

클래스 정의에는 클래스당 최대 1개의 디초기화자를 포함할 수 있습니다.디이니셜라이저는 파라미터를 사용하지 않고 괄호 없이 기술됩니다.

deinit {
    // perform the deinitialization
}

할당을 해제하기 전에 옵서버를 삭제하지 않으면 크래시가 발생합니다.다음을 사용하여 수행할 수 있습니다.

deinit {
    // perform the deinitialization
    print("deinit")

    removeObserver(self, forKeyPath: kSelectedViewControllerKey, context: nil)
    removeObserver(self, forKeyPath: kSelectedIndexKey, context: nil)

}

뷰가 범위를 벗어났을 때 뭔가를 제거하고 범위를 벗어났을 때 시작하려면 컨트롤러의 didAple 및 didAple 메서드로 실행하는 것이 좋습니다.NSNotification Center도 보기가 나타나거나 사라졌을 때 제거했다가 다시 추가할 수 있습니다.

다른 클래스의 메서드를 deinit에서 호출할 때 아마 크래시가 발생할 수 있습니다.

언급URL : https://stackoverflow.com/questions/25497928/dealloc-in-swift

반응형