• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

dispatch weak 에 대해

21.02.14 01:13 작성 조회수 178

1

안녕하세요!

예시를보다보니

queue.asynch { [weak self]in

  ....

  mainQueue.asynch { 

    ....
  }

}

이런류의 예시가있는데 

아래부분에는 weak self가 없어도 되는건가요?

둘다 있어야하지않나 싶어서요!

만약 필요없는 이유가 메인큐라서 라던가 그런이유이면 메인큐가 아니더라도 위에서 weak self로 정의해주면 다음 어싱크 클로져에서 위크를 안정의해줘도되는건지 궁금합니다!

답변 2

·

답변을 작성해보세요.

0

일단은 질문주신 내용에 대해서,

추가 강의를 찍어서 GCD - 3.디스패치큐(GCD) 사용시 주의해야할 사항 부분에 번외편 추가강의로 넣어놓았으니

참고해 보시면 좋을 것 같습니다! 


혹시 강의내용으로도 이해가 안되시면 다시 질문 주세요! 감사합니다. :)

0

안녕하세요 jam님!

해당부분에 대해서 자세하게 아시려면, 동기/비동기 관련이 아닌..
실은 스위프트 문법에서 ARC(Automatic Reference Counting)부분Closure의 캡처리스트에 관련된
문법에 대해서 자세하게 공부를 하셔야 하는데요,

스위프트가 일반적으로 메모리 관리를 위해, ARC모델을 사용한다는 것은 아실테고, 클로저도 Heap메모리에
저장이 되기 때문에, 잘못하면 클래스의 객체클로저서로를 가르키게 되어 메모리 해제가
안되는 메모리 누수(Memory Leak) 현상이 발생할 수 있다는 내용입니다.


그리고, 이러한 Strong Reference Cycle의 문제를 해결하기 위해, 클로저에서는
캡처 리스트라는 것을 사용해서, 캡처 리스트내에서 weak이나 unowned로 선언을 하면
Strong Reference Cycle 문제를 해결할 수 있습니다.


그런데, 물론 강한 참조 순환 문제 뿐만아니라 예를 들자면, 뷰 컨트롤러(객체)가 이미 없어졌는데(dismiss),
굳이 클로저가 일을 할 필요는 대부분 없기 때문에.. weak이나 unowned를 사용해서
이런 일(강한 참조로 인해 굳이 할 필요가 없는 일)을 일찍 종료(early exit)시켜서들을 처리하도록 만들 수 있습니다.


그리고 말씀해주신 부분은... 일반적으로 위에서 말씀해주신 예제와 같이 클로저가 겹쳐있을때 가장 상단에 [weak self]로 선언을 하면, 그 내부에서는  main이던 글로벌이던 상관없이 [weak self]로 선언하지 않아도 되는데, 위와 관련해서는 (명확한 이유에 대해서는) 사실 글로 표현할 수없을 정도로 많은 내용을 설명드려야 하므로..


제가 코드 예시와 그림과 함께, 해당 부분에 대한 강의를 추가적으로 찍어서 저녁시간에 올려 놓도록 하겠습니다. (예전에도 메일로 질문 주신 분이 있었어서.. 아무래도, 강의를 추가해서 찍어놓으면 좋을 것 같네요!)


저녁 늦은 시간이나, 내일쯤 확인해 보시면 될 것 같고,
제가 추가 강의를 올려놓으면 여기 질문 란에 다시 댓글로 알려드리도록 하겠습니다.!


감사합니다. :)