본문 바로가기

Swift

Memory issue with closure injection

Swift는 일급객체이기 때문에 클로저도 주입할 수 있어요!

적절한 상황에서 사용해야 이득이지, 잘못 사용하면 사용하지 않는 게 오히려 좋은 줄 몰랐습니다...

(클로저 주입이 무조건 나쁘다는 말은 아닙니다. 환경에 맞게 잘 작성하시면 문제가 발생하지 않을 수도 있습니다.)

 

 

위 그림은 Store.dispatch 메소드를 ViewController로 클로저를 주입을 한 후,

ViewController에서 Action이 발생했을 때 해당 클로저를 사용하는 부분입니다.

 

사실은 해당 클로저를 호출하게 되면, dispatch를 정의한 객체를 strong하게 잡은 상태입니다.(Store 객체)

 

DetailMemberViewController가 메모리에 존재하면 안되는 상황

그렇기에 클로저 주입을 하면, 참조에 관한 제어권을 잃어버리며 

각 객체가 클로저 주입을 할 경우에 메모리에서 해제되지 않는 문제가 발생합니다.

 

 

그렇다면 어떻게 구현해야 하나요?

iOS에서 많이 사용하는 Delegate Pattern으로 위 문제를 쉽게 해결할 수 있습니다.

(해당 패턴에 대해선 이글에서 다루지 않겠습니다.)

 


 

해결책이였던 Delegate Pattern이 생각나기 전에 만났던 문제에 대해서 추가로 공유하겠습니다.

(ARC에 대해서 많은 생각을 하게 만들었던 문제였습니다.)

 

메소드 내부에서만 존재하는 Store는 ViewController가 rc(Reference Counting)을 증가시켜주지 않는 이상

메소드가 끝나게 되면 메모리에서 해제되게 됩니다.

하지만 분명히 vc.subject를 store.subject로 주입했는데 왜 store가 해제되는지 이해할 수 없었습니다.

(이 당시에는 store rc가 ViewController에서 증가시켜준다고 생각했었습니다.)

이 문제를 팀원에게 공유했고, 다른 시야를 확인할 수 있었습니다.

 

 

다른거 모르겠고 rc를 계산해보자, 앞뒤가 안 맞지 않을까요?

위처럼 그림을 그리면서 다시 생각해보니, ARC를 정확하게 계산하지 않았다는 걸 깨닳았습니다.

Store rc를 증가시킨게 아닌 Store.subject의 rc를 ViewController에서 증가시켰기 때문에 

Store는 메모리에서 해제되도 subject는 메모리에서 아직 살아있던 거였습니다.

 

'Swift' 카테고리의 다른 글

Custom Redux Testable  (0) 2021.08.24
Real Time UI Test  (0) 2021.08.06
Custom Redux in Swift  (1) 2021.08.03