Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix] UploadCodyViewController를 dismiss할 때 메모리가 해제되지 않는 현상 개선 #21

Merged
merged 5 commits into from
Feb 1, 2023

Conversation

leeari95
Copy link
Member

@leeari95 leeari95 commented Jan 30, 2023

📕 Issue

관련 이슈를 연결합니다.

fix #22 #23

📙 작업 내역

구현 내용 및 작업 했던 내역, 변경 사항을 포함합니다.

  • TabCoordinator에 CoordinatorFinishDelegate 채택하여 구현
  • TabCoordinator 내부에 자식 코디네이터를 추가하는 로직이 빠져있어 개선
  • 탭바에 아이콘을 추가하는 용도로 사용되는 코드를 dummy 컨트롤러로 개선 (TabCoordinator 118번 라인)

📘 작업 유형

  • 신규 기능 추가
  • 버그 수정
  • 리펙토링
  • 문서 업데이트

📋 체크리스트

  • Merge 하는 브랜치가 올바른가?
  • PR과 관련없는 변경사항이 없는가?
  • 내 코드에 대한 자기 검토가 되었는가?
  • 변경사항이 효과적이거나 동작이 작동한다는 것을 보증하는 테스트를 추가하였는가?
  • 새로운 테스트와 기존의 테스트가 변경사항에 대해 만족하는가?

📱 테스트 방법

PR 리뷰어가 변경사항을 확인할 수 있는 방법을 서술합니다. 의도하는 테스트 결과도 같이 서술하면 더 좋습니다.

  • x

📝 리뷰 노트

구현 시에 고민이었던 점들 혹은 특정 부분에 대한 의도가 있다면 PR 리뷰를 돕기 위해 서술합니다. 리뷰어에게 특정 부분에 대한 집중 혹은 코멘트를 요청하는 경우에도 같이 작성해주면 좋습니다.

  • 개발하다가 발견하게 되어 빠르게 개선했어요~!

🏞️ 스크린샷

작업 내용과 관련된 화면을 추가합니다.

  • 개선하기 전 메모리 그래프 디버깅을 했을 때
    • 화면을 켰다 닫아도 메모리 해제가 되지 않아 인스턴스가 늘어나있는 현상

image

- 누락되었던 자식 코디네이터를 추가하는 로직 추가
- createCody의 경우 dummyController를 추가하도록 개선 (탭바 아이콘 생성 용도)
- 메모리 누수 위험이 있는 곳에 weak 키워드 추가
- TabBarCoordinator 내부에 CoordinatorFinishDelegate 채택하여 구현
Comment on lines 118 to +127
case .createCody:
let coordinator = UploadCodyCoordinator()
coordinator.start()
let dummyController = UINavigationController()
let tabBarItem = UITabBarItem.init(
title: nil,
image: page.pageIconImage,
tag: page.pageOrderNumber
)
coordinator.navigationController.tabBarItem = tabBarItem
dummyController.tabBarItem = tabBarItem
tabBarItem.imageInsets = UIEdgeInsets(top: 13, left: 0, bottom: -15, right: 0)
tabBarController.addChild(coordinator.navigationController)
tabBarController.addChild(dummyController)
Copy link
Member Author

@leeari95 leeari95 Jan 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 코디네이터를 등록해도 실제로는 사용되지 않고 있기 때문에,
불필요한 메모리를 추가한다는 생각이 들어서
수정해서 개선해주었어요.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵넵 최고최고!!

childDidFinish(childCoordinator, parent: self)
switch childCoordinator.type {
case .uploadCody:
navigationController.visibleViewController?.dismiss(animated: true) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아..? tabBarController.dismiss(animated: true)를 사용하는게 맞겠죠..???

Comment on lines 33 to 36
deinit {
coordinator.finished()
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

백 제스처로 화면을 pop 했을 때 코디네이터가 사라지지 않아서 이런식으로 처리해줬는데....
더 좋은 방법이 있다면 추천해주세요 🥹

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅠ요거 같이 고민좀 해보죠,, 이러면 푸시되어 들어가는 모든 뷰컨에 deinit 관련 동작을 넣어줘야하는데,, 음..
일단 나이브하게 생각해보면 BaseNavigationController에서 pop gesture 액션이 들어오면 노티를 쏘고 노티를 쏠 때 만들어둔 CoordinatorType의 rawValue를 넘겨줘서 해당 rawValue의 Coordinator를 Coordinator 클래스에서 노티 처리해주고 이케저케 하면 될 거 같긴한데 지금 자세히 테스트 해볼 수가 없네요ㅠ
일단은 이대로 가시고 TODO 메모 남겨주시면 제가 나중에 개선해볼게요

Copy link
Member Author

@leeari95 leeari95 Feb 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네 저도 우려하셨던 부분이 (이러면 푸시되어 들어가는 모든 뷰컨에 deinit 관련 동작을 넣어줘야하는데) 걱정되서.. 코멘트를 남겨보았어요.
담에 같이 개선해봐요. 저도 추후에 더 고민해볼게요. 답변 감사합니다 🙇🏻‍♀️
이슈를 만들어 두었었는데, 이걸 close하지 않고 그대로 냅둘게요!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants