220907 TIL [약한 참조를 위해 [weak self]를 사용하고 그 로직 안에서 self를 옵셔널 바인딩을 하면 무용지물?]

Doogie·2022년 9월 7일
0
        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를 옵셔널 바인딩을 하는 경우

image

해당 로직히 호출 될 때마다, 즉 옵셔널 바인딩이 될 때 마다 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에 대해서만 옵셔널 바인딩을 한 경우
image

위와 같이 rc가 늘어나지 않는 것을 볼 수 있다

즉, 약한 참조를 하기 위해 [weak self]를 사용한 뒤 내부에서 self에 대해 옵셔널 바인딩을 하면 rc가 증가하므로 이럴 때는 [weak self] 키워드가 무용지물이 된다고 생각할 수 있다

profile
끊임없이 문을 여는 개발자

0개의 댓글