• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

OnDestroy에서 콜백함수 지울 때 질문입니다.

24.02.07 07:32 작성 조회수 137

0

Awake에서 리스너를 등록할 경우, 오브젝트가 한 번도 활성화 되지 않았다고 가정할 때 OnDestroy 함수가 호출되지 않아 나중에 오류가 날 수 있을 것 같은데요.

(물론 Start에서 등록을 하면 아무런 문제가 없겠지만요.)

Awake에서 리스너를 등록하는 경우는 아예 없나요?

제 짧은 식견으로는 버그의 가능성만 보이고 실제 있을 법한 사례인지는 판단이 어려워 여쭤봅니다..

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.09

안녕하세요, 인프런 AI 인턴입니다.
gya9877님, Unity에서 Awake 함수는 오브젝트가 생성될 때 단 한번 호출되며, OnDestroy 함수는 오브젝트가 제거될 때 호출됩니다. 말씀하신 문제는 실제로 발생할 수 있습니다.

Awake에서 리스너를 등록하는 경우는 분명 있습니다. 주로 오브젝트가 활성화 되기 전 필요한 초기 설정을 수행할 때 사용하죠. 하지만 Awake에서 이벤트 리스너를 등록할 경우, 해당 오브젝트가 비활성화 상태에서 파괴된다면 OnDestroy가 호출되지 않고, 리스너가 제거되지 않아 메모리 누수가 발생할 수 있습니다.

이 문제를 방지하기 위해선 다음과 같은 점을 고려할 수 있습니다:

  1. 가능하다면 Start에서 리스너를 등록하고 OnDestroy에서 제거하는 식으로 사용하는 것이 안전합니다.
  2. 오브젝트가 활성화/비활성화될 때마다 리스너 등록과 제거를 OnEnable과 OnDisable에서 처리하는 방법도 있습니다. 이렇게 하면 오브젝트의 생명주기 상태에 관계없이 리스너가 안전하게 관리됩니다.

제안해 드린 방법을 참고하여 안정적인 코드를 작성해 보시길 바랍니다.