study record

dequeueReusableCell(withIdentifier:for:) 의미와 장점 본문

iOS/iOS 정리

dequeueReusableCell(withIdentifier:for:) 의미와 장점

asong 2022. 3. 17. 14:16

dequeueReusableCell

func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell

파라미터로 2개를 받고, UITableViewCell을 반환한다.

지정된 재사용 식별자에 대한 재사용 가능한 테이블뷰 셀 객체를 반환하고 이를 테이블에 추가한다.

 

identifier는 재사용할 객체를 나타내는 문자열로, 재사용할 객체를 나타내주는 것이다.

for는 indexPath를 받는다. 셀의 위치를 지정하는 것이 indexPath로서, 데이터 소스는 셀에 대한 요청이 있을 때 인덱스 경로를 사용하여 셀의 위치를 기반으로 추가구성한다.

 

- 왜 사용하는가?

만 개 이상의 많은 테이블 셀이 구성되어야 할 때 모든 셀에 대해 항목을 만드려면 메모리가 아주 많이 들게 된다. 재사용해서 사용하는 셀은 이미 할당된 메모리의 셀을 재사용하는 것이기 때문에 추가적인 메모리의 손실이 없다. 따라서 dequeueReusableCell을 사용한다. 

 

테이블 높이와 셀 높이를 기반으로 정확하게 셀 수를 생성한다. 이 시점에서 메모리 할당은 딱 알맞게 적은 수의 셀에 대한 메모리 할당만 이루어지면 된다. 테이블 뷸르 스크롤하면 여전히 동일한 셀이 사용되지만 데이터 소스를 기반으로 셀 내용이 바뀌게 된다. 셀이 스크롤 화면 밖으로 나가게 되면, 이 셀은 reuse pool에 들어가게 되고 dequeueReusableCell을 호출할 때 테이블 셀에 의해 반환된다.

이 때 만약 한 셀에 체크박스 표시가 되었다고 치자. 이후 다른 데이터를 담고 있는 셀에 체크박스 표시가 나타나는 문제가 생길 수 있다. 이 문제는 셀의 속성을 초기화시켜주지 않은 채 재사용했기 때문에 발생한다. 따라서 재사용되는 셀의 속성을 초기화시켜주면 된다. 

prepareForReuse()를 사용하면 셀의 뷰 측면의 속성들을 초기화시킬 수 있다. 성능을 위해서 prepareForReuse 메소드 안에서는 content와 무관한 property들만 reset 하는게 좋다.

 

override func prepareForReuse() {
   super.prepareForReuse()
   
   imageView?.image = nil
}

 

참고: 

https://zeddios.tistory.com/55

https://sihyungyou.github.io/iOS-dequeueReusableCell/

'iOS > iOS 정리' 카테고리의 다른 글

iOS App 실행 과정  (0) 2022.03.25
[iOS] View의 생명주기  (0) 2022.03.23
[iOS] NotificationCenter  (0) 2022.03.16
[iOS] AppDelegate, SceneDelegate  (0) 2022.03.10
[iOS] 왜 GCD(Grand Central DispatchQueue)를 사용하는가?  (0) 2022.03.07