Strong - 강한 참조
- 해당 인스턴스의 소유권을 가짐
- 자신이 참조하는 인스턴스의 retain count를 증가시킴
- 값 지정 시점이 retain이 되고 참조가 종료되는 시점에 release
- default 값
- RC 조정으로 ARC로 인한 메모리 해제를 피하고, 객체를 안전하게 사용하고 싶을 때
Weak - 약한 참조
weak var test = Test()
- 포인터 개념: 해당 인스턴스의 소유권을 갖지 않고 주소값만 가짐
- 객체가
nil
일 수도 있기 때문에 접근할 때는 무조건 Optional 사용해야 함
- 자신이 참조하는 인스턴스의 retain count를 증가시키지 않음
- 자신이 참조는 하지만
weak
메모리를 해제시킬 수 잇는 권한은 다른 클래스에 있음
- 메모리가 해제될 경우 자동으로
nil
으로 초기화
- retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용
Unowned - 미소유 참조/약한 참조
unowned var test = Test()
- 해당 인스턴스의 소유권 가지지 않음
- retain count 증가시키지 않음
nil
이 될 수 없음
Optional
로 선언되면 안됨
- 객체의 라이프사이클이 명확하고 개발자에 의해 제어 가능이 명확한 경우
weak Optional
대신 사용
- 간결한 코딩
Weak vs. Unowned
Weak: 객체를 계속 추적하면서 객체가 사라지면 nil
로 바꿈
Unowned:
- 객체가 사라지게 되면 dangling pointer가 남음
- Dangling pointer: 원래 바라보던 객체가 해제되면서 할당되지 않는 공간을 바라보는 포인터
- 댕글링 포인터를 참조하면 crash >
unowned
은 사라지지 않을거라고 보장된 객체에서만 사용
순환참조
- 서로가 서로를 소유해 절대 메모리 해제가 되지 않음
- ARC가 메모리 관리를 해주지만 자칫 잘못하면 순환참조가 발생할 수 있음
(ex) Delegate 패턴: 일을 시키는 객체와 일을 하는 객체가 존재
vc.delegate = self
위 코드 등으로 순환참조(양방향 참조) 발생
- ViewController2에서 ViewController2 객체를 만듦 > ViewController1이 ViewController2 소유
- ViewController2의 delegate을 ViewController1로 연결해줌 > ViewController2가 ViewController1을 소유
해결방법: delegate에 weak
붙이기 > ViewController1만 ViewControlelr2 소유 > 순환참조 X
weak var delegate: FirstViewProtocol?
참고: [Swift] 메모리를 참조하는 방법 (Strong, Weak, Unowned)