[swift] retain cycle 이슈

앱 개발 시 발생할 수 있는 메모리 누수 문제 중 하나가 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 이슈를 해결할 수 있다.


참고 문헌:

  1. Apple - Automatic Reference Counting
  2. Ray Wenderlich - Understanding Retain Cycles in Swift