선형회귀 문제에 대해서 모르는 사람은 적을 것이다.
swift에선 언어적인 레벨에서 포인터가 감춰지기 때문에 포인터를 직접 다룰일이 적다.
하지만 레퍼런스 타입과 값타입으로 나누고 있기 때문에 여타 언어처럼 내부적으로는 포인터를 사용한다는 걸 알수있다.
그러면 어떤 곳에서 선형회귀 문제가 나올까라고 생각했을 때 크게 2가지 부분이 있다.
1. 클래스 멤버 변수로 레퍼런스타입을 할당할 경우
2. 클래스 생명주기에 묶인 클로저 내부에서, 선영회귀와 관련된 오브젝트의 캡쳐가 발생했을 경우. (대부분 self)
이 포스트를 쓰게된 계기는 2번에 해당한다.
새로운 기능을 구현하는 단계에서 Rx 스트림을 작성했고 내부에서 self 캡쳐가 선형회귀를 만들었다.
아래 문제의 코드를 보자:
실제로 클래스의 deinit에 들어오지 않은 것 또한 확인했다.
'weak self를 썼기 때문에 문제가 없다'라는 인식을 가지고 검증하지 않은 채 넘겨왔었는데, 이번에 문제가 된다는 걸 확인했다.
'에이 혹시 그러겠어?'라는 안일한 생각으로 개발을 했기 때문이다. 반성한다..
클로저 내부 클로저에서 self를 사용하기 때문에, 사용처에서 weak를 하자라는 생각을 가지고 있었는데, 실제로 첫 사용은 최상단에서도 capture가 일어나서 메모리릭이 발생하고 있는 것이다.
문제는 다음과 같이 수정하면 풀린다.