간단한 요약
SideTable은 Swift 4 이후로 weak 참조일 때 weak reference count에 상관없이
strong reference count가 0 이면 바로 deinit과 메모리 deallocated가 진행되게하는
성능향상을 위한 것!
먼저 weak 와 unowned 사용의 가장 큰 차이는 공식문서를 참고하자면, unowned는 참조하는 다른 인스턴스의 수명이 같거나 더 길 때 사용한다는 점입니다.
Swift 4 이후로는 더욱 차별점이 생겼습니다. 바로 weak 참조는 SideTable을 참조하여 strong reference count가 0이 되면 weak reference count에 상관없이 object deinit , memory deallocated 가 발생하게 됩니다.
unonwed는 직접 해당 객체를 참조합니다. 하지만 weak는 SideTable을 참조합니다.
이러한 차이 때문에unonwed는, strong reference count가 0이어도 dangling pointer를 남기게 됩니다.
weak는 객체가 파괴되고 완전히 메모리 또한 할당 해제됩니다.
(밑에서 자세히 알아보겠습니다~)

흠.. deinit이 되면 무조건 메모리가 해제된거아니야 ?
Swift 4 이전에는 오브젝트는 사라져도 메모리가 해제되지 않는 경우가 있었습니다.
class User {
let id: Int
let email: String
}
위의 User Class를 강하게 참조하면 아래의 경우입니다.
추가로 가정을 해보겠습니다. 위의 strong reference count 1을 가진 User Class를 추가로 약한 참조를 진행합니다. 그리고 조금 있다가 strong reference count가 0으로 감소합니다.
이러한 상황이면 바로 객체는 deinit 되지만, 해당 메모리는 해제가 되지 않습니다.
추후 런타임에서 좀비객체를 확인하여 weak reference count를 감소시키고 메모리 해제를 진행합니다. 따라서 좀비 객체가 짧게 혹은 오래 살아있을 가능성이 생깁니다.
그래서, strong referece count가 0이 되면바로 객체 deinitialized가 되며 메모리 해제 deallocated가 진행 되도록 SideTable의 개념이 Swift 4 부터 생겼습니다.
strong, unowned 참조는 객체를 직접 참조합니다.
weak 참조는 객체의 SideTable(옵셔널)을 참조합니다.
SideTable은 옵셔널 이며, weak 참조인 경우에 생기게 됩니다.
위와 같이 strong reference count가 0이 되면, 즉시 object deinit 과 메모리 deallocated가 진행됩니다 !
이러한 방법으로 Swift는 SideTable을 이용하여 좀비 객체를 만들지 않으며 메모리를 deallocated 합니다 !

참고: https://maximeremenko.com/swift-arc-weak-references
'Swift information' 카테고리의 다른 글
우아한 Model Data 처리 (1) (0) | 2022.06.11 |
---|---|
클로저 - Capturing Values와 ARC (0) | 2021.12.03 |
ARC 시리즈 1 - Retatin Cycle 과 Reference Count (0) | 2021.11.02 |
Struct와 Class에서의 let 과 var의 차이에 대하여 (0) | 2021.11.02 |