앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
GCD사용시 주의해야할 사항 (weak/strong 캡처 주의) (문법 - 179강)
GCD 사용시 주의사항 강의 질문있습니다.
595
작성한 질문수 8
weak self 사용해서 코드 동작 시 "글로벌큐에서 출력하기" 가 출력이 안나와야하는데 출력이 됩니다.. 어떤 문제가 있을까요..?
이미지 첨부합니다.
답변 2
0
네 ! 감사합니다!
그렇다면 실제로 앱을 만들때도 뷰컨트롤러의 캡처를 피하기 위해서 저런식으로 인터벌을 줘야할까요..?
1
아니요. 앱을 만들때는.. 실제 비동기적인 실행이 필요한 "오래걸리는 작업"을 하게 될 것이므로 이런 이슈가 생기지 않습니다.
(인터벌을 줄 필요가 없다는 것이지요. 여기는 비동기 상황을 가정하고, 실제코드는 컴퓨터 내부에서 너무 빨리 진행되기 때문에 이런 상황이 생길 뿐입니다.)
0
강의 화면에서는 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 }이렇게 위아래 코드 순서만 바꿔주시면 될 것 같습니다.
설명드리고 있는 논리는 똑같으니, 이렇게 코드를 바꿔주시면 제대로 동작하는 것을 확인하실 수 있습니다.
(추가적으로 궁금한 부분이 있으시면, 추가 질문으로 남겨주세요!)
감사합니다. :)
수강연장부탁드려도될까요..
0
45
2
Drawing Cycle 관련 질문
0
74
1
앱 제작 시 주로 코드로 작성하시는 이유가 있을까요?
0
99
2
델리게이트 패턴 관련 질문
0
71
2
수강 기간 연장 부탁드릴 수 있을까요?
0
69
1
활용 앱 57강 질문입니다.
0
57
1
활용 앱 30강 에러 질문입니다
0
67
2
기초앱 17강 Contraints 설정 질문입니다.
0
69
2
기초 앱 4강 Type Any -> UIButton
0
70
2
34강 유용한 앱 추천에 나오는 UIKitViewer에 대해서 질문이 있습니다
0
82
1
깃에 코드는 올려도 된다고 하셨는데
0
113
1
수강기간 연장신청 드려도 될까요?
0
86
1
수강 기간 연장 부탁드려도 될까요?
0
122
2
수강 기간 연장 신청 요청드립니다.
0
133
2
playground에서 상단 실행?아이콘 회전 관련하여...
0
140
1
활용앱53강에서 질문있습니다.
0
170
2
Project 명칭 변경방법이 궁금합니다.
0
142
1
override 에 대해서 궁금한 것이 있습니다.
0
127
2
섹션8] 코드 리팩토링 문의
0
104
1
xcode 에서 ios 버전 선택 및 시뮬레이터 관련 질문
0
574
2
수강 기간 연장 부탁드려도 될까요?
0
134
2
뷰모델의 상태변화 와 didSet
0
100
1
@Sendable 키워드
0
97
1
클로저
0
110
2





