안녕하세요, 한 뷰컨트롤러에서 두 개의 테이블뷰를 사용해서 채팅창을 만드는 작업을 하고 있습니다.
(gif 입니다)
첫번째 테이블뷰는 기본적으로 뷰컨에 넣어져 있고, 우측의 버튼을 누르면
뷰컨트롤러 바깥의 뷰를 내부로 addSubview를 통해서 불러오고 있는데요. 이 두 테이블뷰 모두 하나의 구조체 속 배열에서 데이터를 받아오고 있습니다.
초기에 두번째 테이블뷰를 열기 전에는
메모리가 33mb 정도였는데, 두번째 테이블뷰가 열린 후부터는 메모리가 10배 정도 많아졌습니다. 이후 뷰를 removeFromSuperView로 지워도 차지하는 메모리 양은 차이가 없더라구요.
이렇게 차지하는 메모리 양이 갑자기 늘어나는 경우 디버그 방법이나 해결 방법은 어떤게 있을까요? 그리고 저렇게 테이블뷰가 메모리를 많이 차지하면 테이블뷰에 row를 추가할 때 row가 잘못된 정보를 표시할 가능성도 있나요?
좋아요 1
- removeFromSuperView 함수는 뷰 구조에서 제거하는 것이지 메모리에서 해제하는 것은 아닙니다.
많은 경우, 뷰 구조에서 제거했더니 더 이상 참조되는 곳이 없어서 해제되는 상황입니다. ( weak 를 이용한 참조 )
만약 weak가 아닌 참조라면 뷰 구조에서 제거해도 메모리에서 해제되지 않습니다.
예전에 작성했던 글 입니다. 참고해보세요.
- 뷰 디버깅을 해보세요.
-
테이블 뷰 데이터소스에서 셀을 얻어오는 코드를 확인해보세요. 셀 재사용을 하는 API 사용 여부.
-
테이블 뷰 하나에 30메가인데, 하나를 더 추가했다고 300메가가 되는 현상이 이상하네요.
좋아요 1
뷰 컨트롤러 바깥에 있는 뷰라도 테이블뷰처럼 리소스를 많이 소모하는 뷰라면
테이블 뷰 컨트롤러를 만들어서 TVC 가 관리하도록 하고, 그 TVC의 뷰를 서브뷰로 붙이고 떼내는 방식으로 동작을 시키는 게 좋을 것 같아요.
지금은 뷰에서 떨어진 서브뷰가 메모리에서 해제되지 않고 계속 새로운 뷰가 생성되어서 추가되고 있네요.