closure의 weak self 사용에 대한 질문입니다!

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 드타장
      참가자
      • 글작성 : 8
      • 답글작성 : 2
      class Thing {
        var disposable: Disposable?
        var total: Int = 0
        deinit {
          disposable?.dispose()
        }
        init(producer: SignalProducer<Int, NoError>) {
          disposable = producer.startWithNext { number in
            self.total += number
            print(self.total)
          }
        }
      }
      

      위의 코드에서 closure는 self가 해제 될 때까지 기다리고 self는 closure가 해제될 때까지 기다리는 strong reference cycle 상황을 만든다고 하는데, 이 부분이 잘 이해가 되지 않습니다. ㅜㅜ
      또한

      disposable = producer.startWithNext { [weak self] number in
        self?.total += number
        print(self?.total)
      }
      

      위와 같이 수정하듯 closure 내부에서 self를 사용하게 되는 모든 경우에서 [weak self] 를 사용하면 되는건지도 궁금합니다 !

    • 드타장
      참가자
      • 글작성 : 8
      • 답글작성 : 2

      https://greenchobo.tistory.com/3
      이 글을 참고했습니다 !

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      우선 위 내용을 이해하려면 스위프트의 ARC라는 개념과 클로저의 Capture라는 개념을 이해해야합니다.
      예제 코드의 클로저는 클로저가 생성되는 시점의 인스턴스 상태를 유지하기 위해 클로저 내부의 인스턴스를 모두 획득(capture) 해둡니다.
      그러기 위해서 self 즉, 클로저는 프로퍼티로 갖게되는 Thing 클래스의 인스턴스가 클로저에 의해 획득되어 reference count가 1 증가합니다.
      또, 해당 클로저가 disposable이라는 인스턴스 프로퍼티에 할당되므로 클로저의 reference count도 1 증가합니다. 서로 reference count를 올려주기 때문에 순환참조 문제가 발생합니다.
      이에 대해 더 알아보고 싶다면 스위프트 언어 가이드 문서 중 ARC 문서(https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html)를 참고하면 훨씬 도움이 됩니다.
      영어가 너무 어렵다면 ARC 및 클로저 값 획득 등의 내용으로 검색해보면 많은 내용 찾아볼 수 있습니다.

    • jxxnnee
      참가자
      • 글작성 : 6
      • 답글작성 : 4

      야곰님이 링크를 올려주셨지만

      http://minsone.github.io/mac/ios/swift-automatic-reference-counting-summary

      해당 문서를 민소네님이 한글로 번역한 글이 있어서 링크 걸어둡니다!

3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom