본문 바로가기
iOS/UIKit

delegate가 weak, optional타입을 가지는 이유

by 지금갑시다 2022. 8. 30.

 

정처 없이 delegate에 대해 알고싶어서 'cmd + 클릭'로 정의되어 있는 코드들을 탐색하다..

 

문득!

ARSCNView의 delegate
UIImagePickerController의 delegate

 

어.. 근데 왜 delegate가 'weak'에 타입은 옵셔널(?)이지..?

라는 생각이 들어 잘성하는 글이다ㅎㅎ

 

 

vc.delegate = self

 vcdelegate현재의 ViewController에서 구현하고 싶어 선언해주려 할때, 위의 코드처럼 무의식적으로 작성하는 과거의 나를 떠올리며, 왜 그동안 수긍했나 라는 생각이 든다ㅎㅎ

 

 우선 "왜 옵셔널인가?"에 대한 답은 delegate가 채택이 안된상태로 존재할 수 있기 때문이다.

delegate가 있지만, 선언을 해 구현할 필요가 없을 경우가 있고,

delegate가 선언되어 있었지만, 구현을 맡고있던 객체를 빼내어 nil값을 갖게 되는 경우가 있기 때문이다.

 

 그럼 이제, "왜 weak인가?" 라는 질문에 대한 답이 남았다.

위에 대한 답변으로는 weak과 strong에 대한 기초적 이해가 있어야 하는데, 차이로는 아주 간단히 말하면

 

 strong의 경우 강한 참조라고 불리며,

 값을 할당받아 해당 인스턴스에 대한 retain count를 증가 시키고, 값을 할당받는 시기에 retain count의 값을 1 증가시키고, 값이 사라지는 시기에 retain count의 값을 1 내려 counting되는 값에 영향을 미친다.

 

 weak의 경우 약한 참조라고 불리며, 

 값을 할당받아도 해당 인스턴스에 대한 주소값만 가질뿐, retain count값을 증가시키지 않는다. 또한 값에 대한 메모리의 해제가 일어나면, 자동으로 nil로 초기화가 된다.

 

그래서 왜 weak인데!

 

아까 코드로 돌아가보자

vc.delegate = self

 

위의 상황을 vc 객체에 대한 delegate를 self라는 역할을 하는 컨트롤러가 있다고 생각해보자.

 

delegate가 weak이 아니라면,

vc객체를 만든 컨트롤러가 vc에 대한 참조가 생기고, vc의 delegate가 컨트롤러에 생겨 vc역시 컨트롤러를 참조하게 된다.

이는 양방향으로 참조가 생기는 것이고, 이는 서로를 계속해서 순환하는 순환참조가 된다.

 

순환참조가 생겨버리면, 어느 하나의 값이 nil값이 되더라도 한쪽에서는 계속 그 주소를 참조하고 해제 되지 않는 경우가 생길 수 있기에 조심해야 한다.

 

그.래.서. 그 순환참조를 끊어내기 위해서 delegate가 weak로 구현되어 있는 것이다.

그렇게 되면 컨트롤러만 vc를 참조하고 있으므로, 순환 참조의 문제가 사라지게 된다!!

 

끗!

 

'iOS > UIKit' 카테고리의 다른 글

DataSource말고 DiffableDataSource로  (2) 2023.01.06