적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift ARC] strong / weak / unowned references 강한 참조 약한 참조

hongssup_ 2023. 2. 7. 21:09
반응형

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 로 설정이 되어있는지 확인해야할 책임이 있다. 

 

 

728x90
반응형