강한 참조 사이클
![](https://velog.velcdn.com/images/rudin_/post/3a977cb5-a01c-4ae4-a20b-f528afc16907/image.png)
이러한 클래스가 있다고 하자.
![](https://velog.velcdn.com/images/rudin_/post/98693023-0663-44ce-914f-39f9ec085498/image.png)
![](https://velog.velcdn.com/images/rudin_/post/494e0a39-03c9-43d5-b783-1c546fec3dc7/image.PNG)
- 그러나, 접근 가능한 수단이었던 person과 rentedCar이 nil이 되었기 때문에 여전히 남아있는 person.car과 car.lesse에는 접근할 수 없고, 메모리 누수 현상이 발생한다.
- 이를
Strong Reference Cycle
, 또는 참조 사이클이라고 부른다.
- ARC는 이를 자동으로 해결하지 못한다.
강한 참조 사이클 해결 방법
- 두가지 모두 강한 참조를 제거하는 방식이다.
- 참조 카운트를 증가시키거나 감소시키는 방식이 아니다.
- 참조를 통해서 인스턴스에 접근만 하는 것.
- 다른 객체가 소유권을 포기하고 참조 카운트가 0이되면 weak, unowned reference인 객체가 사용중이더라도 소멸된다.
Weak Reference
- 대상을 소유하지 않으며 접근만 하는 방식
- 참조 카운트를 바꾸지 않는다.
- 접근하고 있는 대상이 소멸되면 자동으로 nil로 초기화
- 인스턴스의 생명주기가 소유자와 같거나 짧을 때 주로 사용하는 방식
weak var name: Type?
![](https://velog.velcdn.com/images/rudin_/post/717cf5bf-ba16-4173-b530-d3c30cd78641/image.png)
- lesse를 weak Reference로 변경 시 참조 사이클을 해결함
Unowned Reference
비소유 참조
- 대상을 소유하지 않음
- 보통은 타입이 옵셔널
- weak과 다르게 참조 대상이 사라져도 nil로 초기화되지 않는다.
- 따라서 소멸 후 접근하면 크래시가 발생하니 유의하자.
- 꼭 필요한 경우에만 사용하는게 권장되며, 보통은 weak을 사용하자.
unowned var name: Type
unowned var name: Type?
![](https://velog.velcdn.com/images/rudin_/post/11aba858-a001-46d0-bf2c-327049990c94/image.png)