mainView.bookListCollectionView.rx.prefetchItems.bind(onNext: { [weak self] in
print(CFGetRetainCount(self))
guard let self = self else {
return
}
print(CFGetRetainCount(self))
if $0.last?.row == self.viewModel.items.value.count - 1 {
}
})
.disposed(by: disposeBag)
위와같이 약한 참조를 위해 [weak self] 키워드를 사용하고 내부에서 사용이 편하기 위해 해당 self를 옵셔널 바인딩을 하는 경우
해당 로직히 호출 될 때마다, 즉 옵셔널 바인딩이 될 때 마다 rc가 늘어나는 것을 확인 할 수 있다
mainView.bookListCollectionView.rx.prefetchItems.bind(onNext: { [weak self] in
print(CFGetRetainCount(self)) // rc 확인
guard let itemsCount = self?.viewModel.items.value.count else {
return
}
print(CFGetRetainCount(self)) // rc 확인
if $0.last?.row == itemsCount - 1 {
}
})
.disposed(by: disposeBag)
반면 위와 같이 self에 대해서 옵셔널 바인딩을 하는 것이 아닌 self는 옵셔널 값 그대로 두고 count에 대해서만 옵셔널 바인딩을 한 경우
위와 같이 rc가 늘어나지 않는 것을 볼 수 있다
즉, 약한 참조를 하기 위해 [weak self]를 사용한 뒤 내부에서 self에 대해 옵셔널 바인딩을 하면 rc가 증가하므로 이럴 때는 [weak self] 키워드가 무용지물이 된다고 생각할 수 있다