register, dequeueReusableCell

나이든별 / Oldstar·2022년 6월 27일
0

Think about Keywords

목록 보기
31/37

공부한 것

  • register(_:forCellReuseIdentifier:)
  • dequeueReusableCell(withIdentifier:)

고민한 점 및 생각해본 점

  • 상기 두 메서드는 모두, 테이블 뷰 셀에 관련된 메서드이다.
  • Swift의 테이블 뷰 셀은, '재사용'될 수 있다. 이게 무슨 뜻일까?
  • 말 그대로, 이미 생성되어 있는 테이블 뷰 셀 인스턴스를 재사용할 수 있다는 뜻이다.
  • 먼저 근본적으로, 메모리의 관리를 위해 iOS 앱에서는 항상 Reuse Queue가 돌아가고 있다. 테이블 뷰나 컬렉션 뷰의 셀들은 이 Reuse Queue를 이용한다.
  • 셀 하나하나는 또한 각각의 뷰이기도 하다. 스크롤 등의 이유로 인해 셀이 화면 밖으로 나간다면, 해당 셀은 '재사용 가능'한 상태가 되며, Reuse Queue에 담긴다.
  • 마찬가지로 스크롤 등의 이유로 화면이 이동된다면, 새로 표시되는 셀 자리에 표시해 줄 셀 또한 필요하다. 이 때, cellForRowAt 메서드는 재사용 가능한 셀이 있는지 먼저 확인하고, 있다면 재사용하며, 없다면 새로 만든다.
  • dequeueReusableCell(withIdentifier:) 공식 문서에 의하면, 성능상의 이유로 인해 테이블 뷰의 데이터 소스cellForRowAt 메서드에서 셀을 배정할 때, 전반적으로 UITableViewCell 오브젝트를 재사용해야 한다.
    • "힙 영역은 비싸다"
  • 따라서 dequeueReusableCell(withIdentifier:) 메서드는 재사용 가능한 테이블 뷰 셀 오브젝트를 반환한다.
    • 해당 Identifier를 가진 셀 중 재사용 가능한 셀이 있다면, 해당 셀의 prepareForReuse() 메서드를 불러오고 재사용한다.
    • 만약 그렇지 않다면, 새로운 셀의 init(style:reuseIdentifier:)을 불러와 새로운 셀을 생성한다.
  • register(_:forCellReuseIdentifier:) 메서드는, 새로운 셀을 만들 때 사용할 클래스를 "등록" 한다.
  • 말하자면, 새로운 셀을 만드는 가이드라인의 역할을 하는 셈이다.
  • 등록을 해제할 때도 해당 메서드를 쓸 수 있는데, 특정 reuseIdentifier를 가진 셀의 클래스를 nil로 정해주면 된다.
    • 이것이 되는 이유는, 특정 reuseIdentifier를 가진 셀이 사용할 클래스 정보를 덮어쓰기 때문.
  • 정작 공부해보니, reuseIdentifier가 가장 중요한 것 같은 느낌이 든다..?
  • 한편, 앱을 사용하면서 재사용 큐가 비어 있을 일은 거의 없다고 보인다. 스크롤을 엄청 빠르게 내리면 중간에 나와야 할 셀의 이니셜라이징이 제대로 되지 않는 경우가 있긴 해도.

참조

https://developer.apple.com/documentation/uikit/uitableview/1614891-dequeuereusablecell
https://developer.apple.com/documentation/uikit/uitableview/1614888-register

profile
함께 나아가고자 하는 사람

0개의 댓글