study record
dequeueReusableCell(withIdentifier:for:) 의미와 장점 본문
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
}
참고:
'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 |