앱 개발 시 발생할 수 있는 메모리 누수 문제 중 하나가 retain cycle 이슈이다. retain cycle은 두 객체가 서로를 강한 참조로 가리키는 경우 발생한다. 이 경우 두 객체가 메모리에서 해제되지 않고 계속해서 유지되기 때문에 메모리 누수가 발생할 수 있다.
retain cycle 이슈 해결 방법
1. Weak References(약한 참조)
weak
키워드를 사용하여 객체 간의 순환 참조를 방지할 수 있다. 약한 참조를 사용하면 순환 참조를 피할 수 있고, 메모리 누수를 방지할 수 있다.
weak var delegate: MyClassDelegate?
2. Unowned References(미소유 참조)
unowned
키워드를 사용하여 참조 대상이 해제될 때 자동으로 nil값이 설정되도록 할 수 있다.
unowned var parent: ParentClass
3. Capture Lists(캡처 리스트)
클로저 내에서 ‘self’를 암시적으로 캡처하면 retain cycle이 발생할 수 있다. 이를 방지하기 위해 클로저에서 self를 명시적으로 캡처하는 방법이 있다.
{ [weak self] in
self?.doSomething()
}
4. Closure Capture List with Weak References
클로저 내에서 self를 약한 참조로 캡처하여 retain cycle을 방지할 수 있다.
{ [weak self] in
self?.doSomething()
}
5. Deinit 확인
deinit
메서드를 활용하여 객체가 메모리에서 해제될 때 필요한 정리 작업을 수행할 수 있다. 순환 참조 때문에 deinit
이 호출되지 않는 경우가 있으므로, deinit
을 통해 해제 작업을 수행하는 부분을 확인해야 한다.
결론
retain cycle은 앱의 성능과 안정성에 영향을 미칠 수 있는 심각한 문제이다. 약한 참조, 미소유 참조, 캡처 리스트, deinit
메서드 등을 적절히 활용하여 retain cycle 이슈를 해결할 수 있다.
참고 문헌: