본문 바로가기
iOS_Swift

Swift Memory leak 관리 (1) - lazy var 변수

by DevJake 2022. 3. 22.

2개 앱을 만들고 앱스토어 출시하고, 앱 운영하면서 지금까지 메모리 누수 문제로 고생하거나, 문제가 된 적은 없었다. 

Swift 가 기본적으로 메모리를 알아서 관리해주기 때문이기도 하고, 실질적으로 에러를 발생시킨 적이 없었으니. 

우연히 모 기업 인터뷰를 보다가 메모리 누수 관련 질문을 받았는데, 

기존에 관심이 없었다 보니 불편한 경험도, 답변을 할 내용도 없었다. 

 

무작정 어떻게든 앱을 만들어야지 라는 급한 의욕과

체계적으로 공부할 이유를 몰랐던 비전공자의 시너지(?)로 발생한 사건이었고 

인터뷰 후, 약 한시간 정도 실력 부족에 대한 자아비판 시간을 가진 후,

 

몇몇 서적과 인터넷을 통해 Swift Memory leak 를 알아보았다. 

앱 안정성에 굉장히 중요한 내용인데 여태 관심도 없었다는 나 스스로에게 반성하며

잊지 않기 위해 포스팅으로 남기려 한다. 

 

이번 공부기록 포스팅에서는 lazy 를 정리해 본다.  

 

1. var 에만 사용 가능하며,

2. Lazy properties must have an initializer - 자동으로 초기화 되지 않는다

3. Struct, Class 에서만 사용 가능

4. 처음 사용할때 받은 값을 계속 저장함. 맨 처음 값을 유지 (처음 사용될때 메모리에 value를 넣고, 그 value를 계속 사용)

    연산 프로퍼티는 해당 프로퍼티 내부 코드가 실행된 결과값을 반환 한다 - lazy 는 사용할 수 없다

5. lazy 변수가 lazy name: String 과 같이 저장용 변수라면 상관없지만, lazy name: () -> String 처럼 클로저를 가진 변수면, 클로저 안에서 다른 변수를 참조할 경우, 순환 참조로 인한 메모리 누수가 발생할 수 있다. 클로저 내부에 반드시 [weak self] 를 해주어야 한다

 

이 복잡한 걸 왜 쓰지? 

1. 불필요한 메모리 차지, 불필요한 실행으로 인한 리소스 사용 방지 

2. lazy 변수의 초기화에 사용되는 클로저에는 @noescape가 자동적으로 적용된다 (?????)

 

내용과 쓰임새를 알아보았고 이해는 했지만, 

실전에서 사용을 해봐야 감이 오지 않을까 싶다.

lazy 를 사용하는 경우에 대한 좀 더 많은 예시를 보아야 할 것 같다. 

댓글