새소식

인기 검색어

iOS/iOS

[iOS] UITableViewCell 또는 UICollectionViewCell 에서 Bind할 때 주의점

  • -

 

개인 프로젝트를 진행을 하다가 보니 메모리의 크기가 점점 늘어나서 앱이 죽어버리는 경우가 생겼다.

왜 메모리가 늘어나는지 메모리 그래프를 사용하여 확인해보니 ViewModel이 없어지지 않고 Cell과 순환참조를 하고 있었다.

 

로직에서 왜 문제인지 찾지 못해 한줄한줄 디버깅 해보니 cell에서 viewModel에 bind할 때가 문제였다.

bind한 stream이 없어지지 않고 계속해서 살아있어서 cell과 viewModel이 사라지지 않고 있었던 것이다.

 

그래서 알게된 것은 tableViewCell이나 collectionViewCell에서 rxSwift나 combine을 사용하여 bind할 경우 주의해야 한다는 것이다.

iOS에서는 효율적인 메모리관리를 위해 cell을 Reuse하는데 이때 bind해준것들을 dispose나 cancel을 해주지 않는다면

새로운 스트림이 계속해서 bind되어 RC관리가 되지않아 순환참조가 발생하거나 메모리가 커져 앱이 죽어 버리는 상황이 발생한다.

 

 

 

 

스크롤 하기 전 1번 cell에 bind된 모습
스크롤을 하여 1번 cell이 재사용되었지만 bind된 스트림을 제거해주지 않아 그 전에 bind 해준 스트림이 살아있게된다.

 

 

cell에서 bind를 할때는 꼭 prepareForReuse에서 disposeBag또는 AnyCancellable를 초기화 해주어야 한다

 

var disposeBag = DisposeBag()

// disposeBag또는 AnyCancellable를 초기화
override func prepareForReuse() {
	super.prepareForReuse()
	self.disposeBag = DisposeBag()
}

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.