[swift] @IBOutlet의 weak 사용

GOSARI·2021년 11월 7일
1

swift

목록 보기
8/11

xcode가 IBOutlet 변수를 생성할 때 기본으로 weak(약한 참조)를 사용한다는 것에 대해서 고민해보았다.

IBOutlet이 strong(강한 참조)로 선언될 때의 Reference Count(참조 카운트)

subView가 view에 할당되어 있는 경우,

  • VC가 subView를 소유하므로 subView: 1
  • VC가 view를 소유하므로 view: 1, subView: 1
  • view가 subView를 소유하므로 view: 1, subView: 2

이 상황에서 메모리 부족으로 didReceiveMemoryWarnig이 호출될 경우 view가 해제됨에 따라

  • VC가 view를 소유하고, view가 subView를 소유하기 때문에 상승한 RC가 내려가므로 view: 0, subView: 1
  • 그러나 VC가 subView를 소유한 것에 대한 RC는 내려가지 않으므로 결과적으로 view는 해제, subView는 해제되지 않은 상태 가 된다.

그렇다면 strong은 언제 사용될까?

view가 해제되어도 하위 뷰에 남겨야 하는 데이터가 있을 때 사용한다는 추측이 이루어졌다. 하지만 이 경우, 하위 뷰의 데이터를 캐시로 저장하는 편이 안전하다고 판단되었기 때문에 strong의 사용처가 불분명해졌다. 더 공부해야지...

아울렛은 왜 weak을 사용하면서도 메모리 생성이 되는 걸까?

연결되지 않은 아울렛을 테스트 코드에 선언해본 결과, load view 직후 strong의 경우 RC는 4, weak은 3인 것으로 확인되었다.

이 3은 어디에서 오는 걸까? 스탠포드 강의의 일부 장면이다.

view hierarchy는 아울렛을 강하게 잡고있기 때문에, 아울렛은 weak 사용이 가능하다.
이 말을 조금 더 살펴보면 내가 위에서 가진 궁금증(RC로 4와 3이 나오는 이유)가 조금은 해소된다고 추측해보았다.


참고링크

이후는... ARC를 더 깊게 파본 이후에 추가할 예정이다.

0개의 댓글