🍎 Apple/Swift

[swift] closure [weak self]를 남용하지 말자.

PushedGun 2023. 10. 27. 00:19

1. closure에서 self를 쓰면 무조건 순환참조?

closure로 값을 넘겨주고, 그 안에서 self를 호출할 일이 있을 때 순환 참조를 우려하여 weak self를 종종 사용하였다.

그런데, 모든 closure라고 항상 self를 쓴다고 순환 참조가 발생하지 않는다.

 

2. non-escaping closure의 경우

위 그림과 같이 함수가 return 되며 closure도 함께 메모리에서 사라지기 때문에 순환참조를 우려할 필요가 없다.

 

class A와, 그 안에서 함수와 함수에서 사용되는 closure 가 있다고 가정하자.

여기서 closure 안에 self를 사용하여도, self 안이 아닌 func 안에 closure이 존재하기에, func가 사라지면 closure도 사라지기에 순환참조가 발생하지 않는다.

 

3. escaping closure의 경우

하지만, escaping closure의 경우는 다르다.

위와 같이, func가 되어 메모리에서 사라져도, heap 영역 메모리에 closure가 계-속 남아있기에 이 경우 self를 사용한다면 순환 참조가 발생한다.

 

그림으로 표현하면, 다음과 같다.

함수 밖에서도 사용이 가능하므로, self 안에 closure가 있고, closure 안에 self 가 있게 되므로, 순환 참조가 발생한다.

 

 

+ closure를 힙 메모리에서 할당 해제해주는 경우

그럼 반대로, func가 사라지고 일정 시간 뒤에 closure을 제거해주는 경우는 어떻게 될까?

이런 경우엔 closure가 계속 남아있지 않으므로, 강한 참조를 사용해도 순환 참조가 발생하지 않는다.