강한 참조 사이클
이러한 클래스가 있다고 하자.
- 그러나, 접근 가능한 수단이었던 person과 rentedCar이 nil이 되었기 때문에 여전히 남아있는 person.car과 car.lesse에는 접근할 수 없고, 메모리 누수 현상이 발생한다.
- 이를
Strong Reference Cycle
, 또는 참조 사이클이라고 부른다.
- ARC는 이를 자동으로 해결하지 못한다.
강한 참조 사이클 해결 방법
- 두가지 모두 강한 참조를 제거하는 방식이다.
- 참조 카운트를 증가시키거나 감소시키는 방식이 아니다.
- 참조를 통해서 인스턴스에 접근만 하는 것.
- 다른 객체가 소유권을 포기하고 참조 카운트가 0이되면 weak, unowned reference인 객체가 사용중이더라도 소멸된다.
Weak Reference
- 대상을 소유하지 않으며 접근만 하는 방식
- 참조 카운트를 바꾸지 않는다.
- 접근하고 있는 대상이 소멸되면 자동으로 nil로 초기화
- 인스턴스의 생명주기가 소유자와 같거나 짧을 때 주로 사용하는 방식
weak var name: Type?
- lesse를 weak Reference로 변경 시 참조 사이클을 해결함
Unowned Reference
비소유 참조
- 대상을 소유하지 않음
- 보통은 타입이 옵셔널
- weak과 다르게 참조 대상이 사라져도 nil로 초기화되지 않는다.
- 따라서 소멸 후 접근하면 크래시가 발생하니 유의하자.
- 꼭 필요한 경우에만 사용하는게 권장되며, 보통은 weak을 사용하자.
unowned var name: Type
unowned var name: Type?