22.08.08 14:15 작성
·
246
0
안녕하세요. 강의 항상 감사합니다 :)
클로저 관련 공부하다가
하나의 함수 내에서
weak var weak_self = self
위처럼 변수를 선언한 후
클로저 내에서 캡쳐리스트를 사용 하지 않고
위에 선언한 weak_self?.xxx 이런식으로
접근해서 사용하는 코드가 있는데
위의 방식도 클로저 내에서 캡쳐리스트를 하여 [weak self]
self?.xxx 접근할 때와 차이가 없는건가요?
스택오버플로우에서 비슷한 질문이 있어서 전달드립니다.
https://stackoverflow.com/questions/41676764/difference-between-weak-self-and-weak-var-weakself-self
답변 3
1
2022. 08. 08. 14:54
안녕하세요 습득자 님!
제 생각에는 지금 사용하신 방식이 Swift3버전 이전에서 사용하던 방식인지는 제가 잘 모르겠습니다. 현재는 해당 방식을 사용하지 않고 있고 (그냥 잘못된 코드인지도) 모르겠어요..^^
그래서 몇가지로 실제로 실험을 해봤더니,
실제 캡처리스트에서 weak self로 선언하는 방식과 다르게 동작합니다.
(저런 방식의 코드를 본적이 없어서, 저도 몇가지로 실험을 해본 것이고,
예전 방식인지 모르겠지만.. 실제로 다르게 동작하기 때문에..
지금 현재 잘못된 방식이란건 확실하다고 말씀드릴 수 있을 것같아요.)
왜냐면, 아래 제가 캡처해놓은 것처럼
weak var weak_self = self라고 사용하실때
이미 지금 할당연산자 부분에서 (오른쪽에서) self가 강한 참조가 일어나는 것으로 보입니다.
(현재의 문법 원칙상 self라고 사용하면 강한 참조가 일어나는 것이 맞고)
그래서
1) self가 (self를) 강한참조 ====> rc +1
2) weak_self변수가 (self를) 약한참조 ====> rc +0
이런방식으로 동작하기 때문에
실제 캡처리스트에서 약한 참조만을 사용할때와 다르게 동작합니다.
해서, 혹시나
참고해 보시라고.. 위의 코드 내용을 구글 드라이브에 올려놓았으니
참고해 보셔도 좋을 것 같아요.
https://drive.google.com/file/d/1XoK7pJe-Muwl0Xb8NanhB58W8hx4WNTL/view?usp=sharing
감사드립니다. :)
앨런 드림
0
2022. 08. 08. 16:42
제가 답변을 달았는데ㅠ 왜 지워진건지는 모르겠네요ㅠㅠ
이 내용의 코드만 보고 정확하게 답변드리긴 어렵습니다.
지금 현재 1) show_reception.. 2) Pop... newInstance.. 함수가 두개 있는데
Pop... newInstance.. 함수가 어떻게 구현되어 있는지 (비동기인지, 내부가 @escaping으로 동작하는지 등의 내용을 알수가 없어서요.)
원칙적으로는 캡처리스트에서 [weak self]로 선언하는게 맞겠지만,
어떤 목적을 가지고 저렇게 선언했을 수도 있다고 생각하긴합니다.
다만 여기서 알 수 있는 내용은
show_reception함수의 실행이 되는 동안은 (약한 참조라고 하더라도) 일단 Pop... newInstance.. 함수가 self를 사용할 수 있도록 하는 역할을 하고 있긴하는 것처럼 보이네요.
(그게 목적을 가지고 그렇게 짠 것인지, 실수로 그렇게 짠 것인지는 모르겠지만요.)
0
2022. 08. 08. 15:14
아.. 함수가 서로 다른 스코프인군요. 일단 이론적으로 말씀드리면
show..함수가 self를 강하게 캡처하고
PopUp..newInstance.. 함수가 self를 약하게 캡처하는데
뭔가 목적성이 있을 것이라고 생각되네요.
이 코드만 보고 맞느냐 틀리느냐는 답변드리기 어려울 것 같아요.
첫번째 함수(show)가 살아있는 동안은
두번째 함수(PopUp..newIns..) 내부의 self가 살아있을 수 있는데,
목적이 있어서 이렇게 짠건지, 아니면 잘못 짠건지는 여러가지로 저 두번째 함수 내부가 어떻게
구현되어있는지 / 그리고 실제 구현의 목적성이 뭔지까지 파악해보아야 알 수 있는 내용이라
말씀드리기는 어려울 것 같네요.
2022. 08. 08. 15:04
안녕하세요. 답변 너무 감사합니다.
그런데 추가적으로 혹시 아래 사진처럼
UIViewController클래스 내의 함수 일부분 사진 찍어보았는데요,
weak var weak_self = self 가 클로저 블록 내부에 선언된게 아닌
함수 내 변수로 선언된 후 클로저 내부에서 사용시 참조하는 경우인데 헷갈려서 다시 질문드려봅니다.