swift reference capture의 주의점

치킨치·2024년 12월 19일

선형회귀 문제에 대해서 모르는 사람은 적을 것이다.
swift에선 언어적인 레벨에서 포인터가 감춰지기 때문에 포인터를 직접 다룰일이 적다.
하지만 레퍼런스 타입과 값타입으로 나누고 있기 때문에 여타 언어처럼 내부적으로는 포인터를 사용한다는 걸 알수있다.
그러면 어떤 곳에서 선형회귀 문제가 나올까라고 생각했을 때 크게 2가지 부분이 있다.
1. 클래스 멤버 변수로 레퍼런스타입을 할당할 경우
2. 클래스 생명주기에 묶인 클로저 내부에서, 선영회귀와 관련된 오브젝트의 캡쳐가 발생했을 경우. (대부분 self)

이 포스트를 쓰게된 계기는 2번에 해당한다.
새로운 기능을 구현하는 단계에서 Rx 스트림을 작성했고 내부에서 self 캡쳐가 선형회귀를 만들었다.
아래 문제의 코드를 보자:


실제로 클래스의 deinit에 들어오지 않은 것 또한 확인했다.
'weak self를 썼기 때문에 문제가 없다'라는 인식을 가지고 검증하지 않은 채 넘겨왔었는데, 이번에 문제가 된다는 걸 확인했다.
'에이 혹시 그러겠어?'라는 안일한 생각으로 개발을 했기 때문이다. 반성한다..
클로저 내부 클로저에서 self를 사용하기 때문에, 사용처에서 weak를 하자라는 생각을 가지고 있었는데, 실제로 첫 사용은 최상단에서도 capture가 일어나서 메모리릭이 발생하고 있는 것이다.

문제는 다음과 같이 수정하면 풀린다.

profile
풀스텍이었던 iOS개발자

0개의 댓글