답변:
스위프트 보장 객체에 대한 마지막 참조가 삭제되면 객체는 deinitialized 것을, 그리고 deinit
코드는 즉시 실행됩니다.
GC를 통해 이러한 종류의 보증을 얻는 것은 불가능합니다. 적어도 성능을 희생하지 않으면 불가능합니다. 표준 GC 메커니즘은 deinit
코드가 결국 다음 GC주기에서 실행 되도록 보장합니다 . 정확한 의미론을 위해서는 어딘가에 참조 횟수가 필요합니다.
chi는 신속한 신체에 관한 특정 질문에 대답했습니다.
참조 카운트 GC와 추적 GC는 언어 속성 또는 구현 속성입니까?
기준 계수 GC 및 추적 GC는 프로그래머에게 다양한 보증을 제공합니다.
참조 카운팅은 객체가 파괴 된 프로그램 흐름의 위치에 결정 성을 제공합니다. 이는 객체가 신속하게 해제되어야하는 부족한 리소스를 소유하는 경우 중요 할 수 있습니다. 반면에 "강력한"참조주기는 처리 할 수 없습니다.
특성이 보장되는 경우 개별 언어의 사양에 따라 달라지며, 따라서 어떤 구현을 준수 구현에 사용할 수 있습니까?
Swift라는 언어를 사용하여 이름을 "Swift with ARC"로 바꿀 수 있습니다. 그런 다음 정확히 같은 구문으로 "Swift with GC"라는 새 언어를 만들 수 있지만 개체 할당이 해제되는 시점에 대한 보장은 줄어 듭니다.
ARC를 사용하는 Swift에서 참조 횟수가 0이면 객체가 이동합니다. 가비지 수집을 사용하면 약한 참조가있는 한 해당 약한 참조를 강한 참조에 할당하여 개체를 "복구"할 수 있습니다. (Swift에서 참조 카운트가 0이면 약한 참조는 nil입니다); 그것은 큰 차이입니다.
물론 SRC는 ARC를 사용하여 마지막 참조 카운트를 죽이면 객체를 즉시 할당 해제합니다. 예를 들어, 같은 파일에 동시에 존재하는 두 개의 인스턴스를 가질 수없는 FileWriter 클래스가있을 수 있습니다. ARC를 사용하는 Swift에서는 oldWriter = nil; newWriter = FileWriter (...)이고 새 FileWriter는 이전 파일을 삭제 한 후에 만 생성됩니다 (다른 참조를 유지하지 않는 한). GC를 사용하는 Swift에서는 작동하지 않습니다.
또 다른 차이점은 "ARC와 스위프트"에 만 강한 참조주기를 통해 참조, 실제로 도달하지 않은 객체가된다는 것입니다 보장 할당이 해제되지 않을 수 있습니다.
deinit
키워드와 관련 의미론 의 존재 는 실제로 구현 영역이 아닌 언어로 참조 카운트를 세는 것입니다.