Strong References
클래스 타입의 프로퍼티, 변수, 상수 등을 선언할 때 별도로 명시하지 않으면 기본적으로 강한 참조를 하게 된다
→ reference count 1 증가
클래스의 인스턴스가 서로가 서로를 강한 참조할 때, 영구적으로 해제되지 않아 메모리 누수가 발생할 수 있다.
이를 해결하기 위해 weak references 또는 unowned references 를 사용할 수 있다.
Weak References
인스턴스를 참조하더라도 참조 횟수를 늘리지 않음
참조하는 인스턴스가 해제되었을 때 자동으로 nil 값을 할당
nil 값을 저장할 수 있어야 하기 때문에 옵셔널과 var로 선언해야 함
Unowned References
인스턴스를 참조하더라도 참조 횟수를 늘리지 않음
weak 과의 차이점?
unowned reference는 그 자체가 값을 가진다.
weak은 참조 대상이 제거되었을 때 ARC가 자동으로 nil 값을 주지만, unowned는 nil값을 주지 않음(항상 값을 가질 것이라 가정)
unowned는 non-optional 타입을 사용하고 해당 인스턴스와 같거나 혹은 더 긴 lifetime을 가질 때 사용
unowned reference는 참조할 인스턴스가 해제되지 않는다고 확신할 때 사용 (unowned로 참조된 인스턴스가 해제되었는데 접근하려고 하면 crash)
In terms of the ARC ownership model, an unowned optional reference and a weak reference can both be used in the same contexts. The difference is that when you use an unowned optional reference, you’re responsible for making sure it always refers to a valid object or is set to nil.
보통 옵셔널일 경우 weak reference를 사용하고, 옵셔널이 아닐 경우 unowned 를 사용하지만,
옵셔널일 경우에도 unowned를 사용할 수는 있다.
다만 unowned를 사용할 경우 인스턴스가 해제되어도 ARC가 자동으로 nil 값으로 설정해주지 않기 때문에,
항상 유효한 객체를 참조하거나, nil 로 설정이 되어있는지 확인해야할 책임이 있다.
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift Concurrency] async / await (0) | 2023.03.06 |
---|---|
[Swift ARC] Strong Reference Cycles 강한 순환 참조 (0) | 2023.02.07 |
[Swift ARC] Automatic Reference Counting (0) | 2023.01.31 |
[Swift] defer 란? (0) | 2023.01.20 |
[Swift] Escape closure 탈출클로저란? (0) | 2023.01.13 |