파싱_weak_closure

hankyulee·2021년 9월 21일
0

closure

목록 보기
1/7
post-thumbnail

공공데이터 RESTful api 를 가져오는 간단한 코드를 작성했다.

resultCode와 resultMsg를 가져와보자.
사실 이렇게 생겼는데,, 쉬운거 부터 가져와보자..

url을 담을 수 있는 구조체를 만드는데, 이 안에 클로져가 있다.
클로져는 미리 선언되어있지 않다.

비동기처리 이다보니 completion handler가 자주 쓰이는걸 볼 수있다. 이에, 클로져를 공부해보기로 했다.

1.The function then calls the closure and executes its code, as if the closure is an ordinary function.(클로저가 마치 원래 그곳에 있었던 애 마냥 실행한다)
2. array.sorted(by: <)에서 파라미터가 클로져였다니 놀랍다. shorthand와 trailing 적용해서..
3.In Swift, a closure captures variables and constants from its surrounding scope. 바깥에서 클로져가 쓰일 수 있는 이유이다. 우리 코드에서보면, 바깥에서 들어오는 파라미터인 data를 사용하고 내부에 있는 요소를 사용할 수있다.

-> 클로져를 쓰다보면 [weak] 을 붙히는 경우가 있는데, 이에 대해 알아보자

ios 는 앱의 메모리 사용을 추적,관리하기 위해 arc기능 사용.
automatic reference counting. 참조 메모리 관리 자동 기능.
참조 회수 카운팅 0 = 그 인스턴스에 대한 메모리 해제.
사용중인데 메모리 해제 하면 crash. 필요하는 동안에 strong reference유지.
하나의 클래스 인스턴스에 여러개의 강한 참조가 연결될 수 있다.
위의 코드와 같이 문제: 두개의 인스턴스가 서로 참조할때 strong reference cycle 발생.-> 래퍼런스 카운트가 0 이 될 수없다. 즉 메모리 누수.
weak var cat 함으로써, cat을 가르키는 strong reference가 +1 되지않아서, cat = nil하면 deinit 된다.

참고로, let a = b as? Database// 이것도 참조시작됨.

  • 클래스처럼 클로저는 참조 타입이기 때문에 강한 순환 참조가 발생할 수 있다. (그 뷰 컨트롤러를 벗어난 상황인데도 여전히 진행되고 있을 수 있다.).이스케이핑 클로저가 아닌 일반 클로저에서는 Scope안에서 즉시 실행되므로 강한 순환 참조를 유발하지 않으므로, weak self를 사용할 필요가 없다. 그러나 이스케이핑 클로저 안에서 비동기 처리가 있을 경우 weak 이용(이스케이핑 클로저에서 self를 참조할경우, arc하나가 줄더라도 강한 참조로 여전히 이스케이핑 클로저에서 동작하게되는 문제로 인해 weak 사용.).

0개의 댓글