인프런 커뮤니티 질문&답변

최수훈님의 프로필 이미지
최수훈

작성한 질문수

앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지

GCD사용시 주의해야할 사항 (weak/strong 캡처 주의) (문법 - 179강)

GCD 사용시 주의사항 강의 질문있습니다.

작성

·

483

0

weak self 사용해서 코드 동작 시 "글로벌큐에서 출력하기" 가 출력이 안나와야하는데 출력이 됩니다.. 어떤 문제가 있을까요..?
이미지 첨부합니다.스크린샷 2023-06-08 오후 3.35.43.png

답변 2

0

최수훈님의 프로필 이미지
최수훈
질문자

네 ! 감사합니다!

그렇다면 실제로 앱을 만들때도 뷰컨트롤러의 캡처를 피하기 위해서 저런식으로 인터벌을 줘야할까요..?

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

아니요. 앱을 만들때는.. 실제 비동기적인 실행이 필요한 "오래걸리는 작업"을 하게 될 것이므로 이런 이슈가 생기지 않습니다.
(인터벌을 줄 필요가 없다는 것이지요. 여기는 비동기 상황을 가정하고, 실제코드는 컴퓨터 내부에서 너무 빨리 진행되기 때문에 이런 상황이 생길 뿐입니다.)

최수훈님의 프로필 이미지
최수훈
질문자

감사합니다!

 

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

강의 화면에서는  weak self 약한 참조일 경우

"글로벌큐에서 출력하기: 뷰컨" print가 작동하지 않았는데.. 최근에 실행해 보면 print가 되는 현상이 발생하고 있는 데... 1년쯤 전에 iOS관련 OS가 업데이트되면서.. 비동기적인 실행 (다른 쓰레드로 보내는 작업 내부) 메커니즘이 약간 업데이트 되면서.. 비동기로 보내는 작업이 아주 빠르게 동작하고 있는 것으로 보입니다.

조금 쉽게 말씀드리자면, (2번쓰레드로 보내는) 클로저의 동작이 (예전 OS에 비해) 너무 빨리 일어나고 있어서 해당 아래 구문이

guard let self = self else { return }

너무 빠르게 동작하고 있어, 위의 옵셔널 바인딩 코드가 너무 빠르게 동작하게 되고 self(ViewController)를 캡처하는 일이 발생하고 있습니다.
self 즉, ViewController가 이미 사라졌어야 하는데, 사라지지 않은 것이죠.

약간의 트릭을 주자면.. 클로저의 동작에 대해 약간의 시간을 주기 위해 위아래 코드를 바꾸시면 됩니다.

sleep(3)
guard let self = self else { return }

이렇게 위아래 코드 순서만 바꿔주시면 될 것 같습니다.

설명드리고 있는 논리는 똑같으니, 이렇게 코드를 바꿔주시면 제대로 동작하는 것을 확인하실 수 있습니다.

(추가적으로 궁금한 부분이 있으시면, 추가 질문으로 남겨주세요!)

 

감사합니다. :)

최수훈님의 프로필 이미지
최수훈

작성한 질문수

질문하기